安全矩阵

 找回密码
 立即注册
搜索
查看: 22444|回复: 83

曾玉芳学习日记

[复制链接]

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
发表于 2020-2-17 22:45:59 | 显示全部楼层 |阅读模式
2月17日:
1.简单复习总结了上个学期的C语言,用C语言练习了一些编程题
2.了解了程序设计和计算机语言(以python为代表)
3.简单的了解了一下算法,知道了算法的重要性及一些常用的算法
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-18 23:08:52 | 显示全部楼层
2月18日:
1.复习了python的各种数据类型和数值数据的计算,学习了python的内置函数,模块和标准库
2.配置好了php环境,并开始学习php:学习了PHP的变量,数据类型,运算符,if...else..elseif语句
  1. <!DOCTYPE html>
  2. <html>
  3. <title>php练习</title>
  4. <body>

  5. <?php
  6. $t=date("H");

  7. if ($t<"10") {
  8.    echo "Have a good morning!";
  9. } elseif ($t<"20") {
  10.    echo "Have a good day!";
  11. } else {
  12.    echo "Have a good night!";
  13. }
  14. ?>
  15.   
  16. </body>
  17. </html>
复制代码

回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-19 22:08:36 | 显示全部楼层
本帖最后由 only 于 2020-4-20 14:14 编辑

2月19日:
1.复习了字符串数据的基本计算,总结了str对象s的常用方法:

2.学习了php语法中的switch和循环结构while,do..while,for,foreach


发现foreach与python中的for..in..类似,表示历遍数组中每个元素
3.学习了php的函数和数组及数组排序,总结了一些对数组排序的函数







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-20 21:23:52 | 显示全部楼层
本帖最后由 only 于 2020-4-20 14:28 编辑

2月20日:

今天通过两个简单的例子回顾了一下for..in循环和while循环
例题一:利用for..in对鸡兔同笼问题进行求解,代码如下:
  1. head = int(input("请输入笼子里头的个数:"))
  2. foot = int(input("请输入笼子里脚的个数:"))
  3. for x in range (1,head):
  4.     y = head - x
  5.     if 2*x + 4*y == foot:
  6.         print("鸡有" + str(x) + "只", "兔有" + str(y) + "只")
复制代码
运行结果:

注:
1.for..in..循环的格式为:
  1. for i in [1,2,3,4,5]:
  2.   print(i*5)
复制代码
in后面是以列表形式出现,还有字典,字符串等,但是整数,浮点数在for循环里会报错2.在上述例子中用到了range()函数,其格式为
  1. range(start,end,step=1)
复制代码
range()会返回一个包含所有k的列表,这里start<=k<end,从start到end,k每次递增step。step不可以为零,否则将发生错误。需要注意的是start和end组成了半开区间,列表里的k取不到end。

例题二:求解银行存款利息问题:已知银行存款利率为1.9%,编写程序计算并输出需要存多少年,10000的存款本金才会连本带利翻一番 ,代码如下:
  1. deposit = 10000
  2. year = 0
  3. while deposit <= 20000:#20000为翻倍后的钱
  4.   year += 1
  5.   deposit = deposit*(1+0.019)
  6. print(str(year) + "年后存款会翻一番")
复制代码
运行结果:

注:
1.while循环的格式为:

当条件被满足时,就会循环执行while内部的代码(while子句),直到条件不成立,办事流程就停止


总结:while与for比较
相同:均可以用来循环
不同:for循环是在序列穷尽时停止,while循环是在条件不成立时停止。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-21 20:25:02 | 显示全部楼层
本帖最后由 only 于 2020-2-21 21:51 编辑

2月21日:
枚举算法

      我们知道,程序设计是给出解决特定问题程序的过程,是设计、编制、调试程序的方法和过程。而我们要知道的是,一个程序的产生,算法是必不可少的,计算机算法是一个程序的灵魂,它是以一步接一步的方式来详细描述如何将输入数据(或问题)转化为所要求输出的过程。先有算法,而后有程序。而今天我主要学习的是枚举算法。


n枚举法就是按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否真正满足问题所求。若是则采纳这个解,否则抛弃它。

枚举法一般使用循环结构来实现,其框架如下:

  1. 设解的个数n初始为0;
  2. 循环(枚举每一可能解):
  3.                 若( 该解法满足约束 ) :
  4.                         输出这个解;
  5.                         解的数量n加1;
复制代码
接下来我们通过1个例子来对这个有更好的理解

例1:将苹果、桔子、香蕉、梨、菠萝5种水果做水果拼盘,每个水果拼盘有3种不同的水果,且有序摆放。问可以有多少种?
问题分析:
n使用列表保存5种水果名。
n通过三重循环结构,枚举各种可能的方案
nxyz的取值范围为5种水果(解空间)
n它们互不相等(筛选条件)
n摆放先后次序有区别
输出所有可能的方案。
算法步骤描述:
n步骤1:建立水果列表fruit
n步骤2使变量x遍历fruit
n步骤3:对于x的每个值,使变量y遍历fruit
—步骤4:对于xy的每个值,使变量z遍历fruit
—步骤5
nz¹x z¹y x¹y
   打印该方案

程序代码如下:
  1. #Fruit plate
  2. fruit=['apple','orange','banana','pear','pineapple']
  3. n=1
  4. for x in fruit:
  5.     for y in fruit:
  6.         for z in fruit:
  7.                 if z!=x and z!=y and x!=y:
  8.                     print(n,x,y,z)
  9.                     n+=1
复制代码
运行结果:(截取部分)


枚举法优化:
n通过一些制约条件,减少解空间可能解的数量,使检验的工作量较少。
n“水果拼盘”改进的算法步骤描述:
步骤1:建立水果列表fruit;
步骤2:使变量x遍历fruit
步骤3:对于x的每一取值,使变量y遍历fruit
步骤4:若x¹y
Ø使变量z遍历fruit
Øz¹x z¹y
   打印该方案

代码如下:
  1. #Fruit plate
  2. fruit=['apple','orange','banana','pear','pineapple']
  3. n=1
  4. for x in fruit:
  5.     for y in fruit:
  6.         if x!=y:
  7.             for z in fruit:
  8.                 if z!=x and z!=y:
  9.                     print(n,x,y,z)
  10.                     n+=1
复制代码
运行结果:(截取片段)

对比发现,枚举法让for要检验的工作量大大减少









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-22 20:36:31 | 显示全部楼层
本帖最后由 only 于 2020-2-22 22:39 编辑

2月22日:
迭代算法

       日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1 。如此经过有限次运算后,总可以得到自然数 1 ;中国南宋数学家杨辉发现的杨辉三角,将二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来。今天我要做的,就是把这两大发现一一尝试一边。

     首先,谷角静夫的发现如果要用代码实现,我们不得不提的是一种算法——迭代。迭代, 是一种不断用变量的旧值递推新值的过程。迭代算法是计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,从一个初始变量值出发,让计算机对一组指令(或一定步骤)进行重复执行,每次执行这组指令(或步骤)时,都从变量的原值推出它的一个新值。最终得到所求解。

     回到这个问题,我们要做的就是:写出算法,由键盘输入一个自然数 n ,把n 经过有限次运算后,最终变成自然数1 的全过程打印出来,然后将算法改编成代码。
分析 定义迭代变量为 n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:     
        当 n 为偶数时, n=n/2 ;
        当 n 为奇数时, n=n*3+1 。
        这就是需要计算机重复执行的迭代过程。
确定结束迭代过程的条件
        这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ?分析题目要求不难看出,对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,就完成了验证工作。
   因此,用来结束迭代过程的条件为: n==1 。
验证谷角猜想的流程图如下:

根据算法,代码如下:

  1. n = int(input("请输入一个自然数:"))
  2. while n != 1:
  3.     if n % 2 == 0:
  4.         k = n / 2
  5.         print("%d/2=%d" % (n, k))
  6.         n = k
  7.     else:
  8.         a = n * 3 + 1
  9.         print("%d*3+1=%d" % (n, a))
  10.         n = a
复制代码
运行结果如下


   与迭代相近的概念是递推。设要求问题规模为n的解,当n=1时,解已知或能方便得到,根据递推关系,能从i-1规模的解,推出i规模的解(i=23、……、n),这就是递推。当然也可以反过来,从nn-1、……、32反推到1。既然我们要用代码将杨辉三角实现就要明白,杨辉三角的特点:

k行有k个数;
行的首尾两数均为1
除首尾两数外,其余各数均为上一行肩上两数之和。
接下来我们写出算法:
1.输入n(杨辉三角行数)
2.设置二维数组a[n,n]
3.循环(从i到n):
     对于每行的首尾数
     a[i,1]=1,a[i,i]=1(首尾两数均为1)
     对于每行其余数
     a[i,j]=a[i-1,j-1]+a[i-1,j] (i为行数,j为该行中的列位置)
4.输出打印二维数组a[n,n]的值
代码如下:
  1. n=int(input('n='))
  2. y= [ [0 for k in range(n+1)] for k in range(n+1)]
  3. for i in range(1,n+1):
  4.     y[i][1]=1
  5.     y[i][i]=1
  6. for i in range(3,n+1):
  7.     for j in range(2,i):
  8.         y[i][j]=y[i-1][j-1]+y[i-1][j]
  9. #print format
  10. for i in range(1,n+1):
  11.     for j in range(1,i+1):
  12.         print('  ',y[i][j],end='')
  13.     print()
复制代码
运行结果:













本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-24 20:01:43 | 显示全部楼层
本帖最后由 only 于 2020-2-24 21:02 编辑

2月24日:
异常

       当我们程序运行的过程中,总是会出现各种各样的错误,我们称之为异常。异常发生后,该异常被一种叫做异常处理的机制捕捉到了,该机制因此做出了反应:输出了出错的提示,甚至强制中止了程序的运行,这意味着,该异常已经被处理了。在今天的学习中,我对异常进行了分析了解。

      

首先,我们应该知道异常有哪些类型,通常情况下,异常可以分为三种:

1.语法错误(Syntax Error):最易定位、改正

2.运行时错误(Run time Error):较难定位,异常设计的主要目标

3.逻辑错误(Logical Error):最难发现。



以下列举了我们一些默认异常处理器:



我们一般捕获、处理异常用try…except…else…finally语句:
  1. 所在地:源程序内
  2. 启动时机:发生异常时先于默认异常处理器启动,如果已经捕捉到的异常,该异常不会再自动被上传至顶层默认异常处理器。
  3. 处理动作:可按实际应用的需求编写……
  4. try子句块:块内语句执行时如果发生异常,则自动抛出异常。
  5. except子句块:匹配捕捉try子句抛出的异常,并处理异常。
复制代码
try...except语句:
源程序:




修改后:



try…except中附加的else子句
功能:当try子句块中的语句块执行时没有发生任何异常,else子句中的语句块就会被接着执行,然后退出整个try语句,接着执行try语句后面的语句。
作用:在此处将无异常发生的正常情况标志位传递给退出try后要执行的语句。


try…except中附加的finally子句
功能:不管try子句中的语句是否发生了异常、不管except子句是否捕捉到了匹配的异常、是否对异常进行了处理,也不管是否程序会因此被终止,都会执行finally子句中的语句块。
作用:执行至关重要的收拾残局、打扫战场的结尾善后工作。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-25 21:53:06 | 显示全部楼层
本帖最后由 only 于 2020-2-26 22:12 编辑

2月25日:
今天课程任务有点多,没有具体学习内容
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-26 22:12:52 | 显示全部楼层
本帖最后由 only 于 2020-2-26 23:11 编辑

2月26日:

冒泡排序与选择排序

今天在复习C语言的时候,突然看见了C语言中两个重要的排序——冒泡排序和选择排序,于是突然有了兴致,打算用python代码去实现这两个过程。

首先,如果我们要写出冒泡排序代码,先要知道冒泡排序的原理

1、循环比较相邻的两个元素,大的向后移动,这样一次循环之后最大的值就放在了最后;
2、再次进行循环,将次大的数放在倒数第二位;
3、重复第二步,直至剩余一个数据


然后设计算法:
第一层循环,循环到当前最大的那个元素的下标
第二层循环,反复比较相邻的两个元素,直至到达最大元素的下标


代码实现:

  1. num = 0
  2. data = []
  3. print('输入你要排序的数组:')
  4. while num != -1:
  5.     num = int(input(''))
  6.     data.append(num)
  7. data.pop()

  8. print('排序前:')
  9. for i in range(len(data)):
  10.     print('%d' % data[i], end=' ')
  11. print()

  12. for i in range(len(data) - 1, 0, -1):
  13.     for j in range(i):
  14.         if data[j] > data[j + 1]:
  15.             data[j], data[j + 1] = data[j + 1], data[j]

  16. print('排序后:')
  17. for m in range(len(data)):
  18.     print(data[m], end=' ')
复制代码
运行结果:




第二个是选择排序,同样的我们先知道原理:

1.设第一个元素为比较元素,依次和后面的元素比较,比较完所有元素找到最小的元素,将它和第一个元素互换
2.重复上述操作,我们找出第二小的元素和第二个位置的元素互换,以此类推找出剩余最小元素将它换到前面,即完成排序


算法设计:
首先在未排序序列中找到最小(大)元素, 存放到排序序列的起始位置
然后再从剩余未排序元素中继续寻找最小(大)元素,放到已排序列的末尾

代码实现:
  1. num = 0
  2. data = []
  3. print('输入你要排序的数组:')
  4. while num != -1:
  5.     num = int(input(''))
  6.     data.append(num)
  7. data.pop()

  8. print('排序前:')
  9. for i in range(len(data)):
  10.     print('%d' % data[i], end=' ')
  11. print()

  12. for i in range(len(data) - 1):
  13.     min_index = i
  14.     for j in range(i+1,len(data)):
  15.         if data[j] > data[min_index]:
  16.             min_index = j
  17.             data[min_index], data[i] = data[i], data[min_index]

  18. print('排序后:')
  19. for m in range(len(data)):
  20.     print(data[m], end=' ')
复制代码
运行结果:


完成两个代码后,我们可以发现,其实相同的问题原理是相似的,我们要懂得将自己所学的语言进行相互转化,才能理解得更加深刻


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-2-27 20:31:51 | 显示全部楼层
本帖最后由 only 于 2020-2-27 22:04 编辑

2月27日:
中国大学排名定向爬虫实例

      有句话说“有人的地方,就有江湖”,同样的有大学的地方就会有排名,今天我的任务就是将中国大学排名成功爬取,并将大学排名屏幕输出。通过查找,我知道在”最好大学网“上,我们可以知道中国各个大学得排名情况,其链接为:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html


首先我们打开中国最好大学网


我们可以看见各大高校的排名情况,之后右键->查看源代码


我们可以发现,大学名称,大学排名等信息都写在了HTML页面中,因此这个定向爬虫代码是可以设计和实现的,此外,我们还需查看这个网站是否提供了robots协议的约定,打开www.zuihaodaxue.cn/robots.txt


我们发现网页不存在,这说明这个网站并没有通过robots协议对爬虫做相关的限制

了解了程序的可行性之后,我们需要对程序的结构进行初步的设计

1.从网络上获取大学排名的网页内容  (getHTMLText())

2.提取网页内容中的信息到合适的数据结构  (fillUnivList())

3.利用数据结构展示并输出结果  (printUnivList())


接下来我们开始编写程序,首先写出程序的结构框架:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. #获取url
  4. def getHTMLText(url):
  5.     return""

  6. #将文章信息放入ulist列表中
  7. def fillUnivList(ulist,html):
  8.     pass

  9. #将ulist信息打印
  10. def printUnivList(ulist,num):
  11.     print("Suc" + str(num))

  12. def main():
  13.     uinfo = []#存入大学信息
  14.     url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"
  15.     html = getHTMLText(url)
  16.     fillUnivList(uinfo, html)
  17.     printUnivList(uinfo, 20)#列举前20所
  18. main()
复制代码
然后我们完善函数的相关功能:

第一个函数,我们用try..except框架实现:

  1. #获取url
  2. def getHTMLText(url):
  3.     try:
  4.         r = requests.get(url, timeout=30)#利用get获取url信息
  5.         r.raise_for_status()#产生异常信息
  6.         r.encoding = r.apparent_encoding#修改编码
  7.         return r.text#返回网页信息
  8.     except:
  9.         return ""#若出现错误则返回空字符串
复制代码
接下来我们第二个函数是要提取html中关键数据,并添加到一个列表里:

  1. #将文章信息放入ulist列表中
  2. def fillUnivList(ulist, html):
  3.     soup = BeautifulSoup(html, "html.parser")
  4.     for tr in soup.find('tbody').children:#源码中可发现所有的大学信息被封装在tbody标签中
  5.         if isinstance(tr, bs4.element.Tag):#每个大学的信息封装在tr标签中,isinstance是检查bs4库的标签类型,若不是tag,就被过滤
  6.             tds = tr('td')#tr中的信息被td包围
  7.             ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
复制代码
最后是打印大学列表:

  1. def printUnivList(ulist, num):
  2.     print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^5}'.format('排名', '学校名称', '城市', '总分', chr(12288)))#表头
  3.     for i in range(num):
  4.         u = ulist[i]
  5.         print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^6}'.format(u[0], u[1], u[2], u[3], chr(12288)))
复制代码


好了,我们将所有代码整理,程序如下:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import bs4
  4. #获取url
  5. def getHTMLText(url):
  6.     try:
  7.         r = requests.get(url, timeout=30)#利用get获取url信息
  8.         r.raise_for_status()#产生异常信息
  9.         r.encoding = r.apparent_encoding#修改编码
  10.         return r.text#返回网页信息
  11.     except:
  12.         return ""#若出现错误则返回空字符串

  13. #将文章信息放入ulist列表中
  14. def fillUnivList(ulist, html):
  15.     soup = BeautifulSoup(html, "html.parser")
  16.     for tr in soup.find('tbody').children:#源码中可发现所有的大学信息被封装在tbody标签中
  17.         if isinstance(tr, bs4.element.Tag):#每个大学的信息封装在tr标签中,isinstance是检查bs4库的标签类型,若不是tag,就被过滤
  18.             tds = tr('td')#tr中的信息被td包围
  19.             ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])

  20. #将ulist信息打印
  21. def printUnivList(ulist, num):
  22.     print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^5}'.format('排名', '学校名称', '城市', '总分', chr(12288)))#表头
  23.     for i in range(num):
  24.         u = ulist[i]
  25.         print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^6}'.format(u[0], u[1], u[2], u[3], chr(12288)))
  26. def main():
  27.     uinfo = []#存入大学信息
  28.     url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"
  29.     html = getHTMLText(url)
  30.     fillUnivList(uinfo, html)
  31.     printUnivList(uinfo, 20)#列举前20所
  32. main()
复制代码

运行结果如下:


其中,我们还需注意的地方是在第二个函数中我们导入了bs4 库,因此在程序前不能忘记import bs4

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 20:59 , Processed in 0.020759 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表