admin 管理员组文章数量: 1086019
2025年1月1日发(作者:java编程设计软件)
Python语言程序设计基础(第2版)
全答案
(Ver. 2.0,2018年5月)
嵩天 礼欣 黄天羽著
(本文档由该书原作者提供,有任何修改意见请反馈:黄天羽 huangtianyu@。)
目录
目录 ..........................................................................................................................................................................................................................................2
第1章 程序设计基本方法 ...............................................................................................................................................................................................5
1.1 计算机的概念 .....................................................................................................................................................................................................5
1.2 程序设计语言 .....................................................................................................................................................................................................5
1.3 Python语言概述 ..................................................................................................................................................................................................5
1.4 Python语言开发环境配置 ............................................................................................................................................................................5
1.5 程序的基本编写方法 .......................................................................................................................................................................................6
1.6 Python语言的版本更迭.................................................................................................................................................................................6
程序练习题 ..................................................................................................................................................................................................................6
第2章 Python程序实例解析 .......................................................................................................................................................................................7
2.1 实例1:温度转换 ............................................................................................................................................................................................7
2.2 Python程序语法元素分析 ............................................................................................................................................................................7
2.3 实例2:Python蟒蛇绘制 ............................................................................................................................................................................8
2.4 turtle库语法元素分析 ....................................................................................................................................................................................8
程序练习题 ..................................................................................................................................................................................................................9
第3章 基本数据类型 ..................................................................................................................................................................................................... 15
3.1 数字类型 ........................................................................................................................................................................................................... 15
3.2 数字类型的操作 ............................................................................................................................................................................................. 15
3.3 模块1:math库的使用 ............................................................................................................................................................................. 15
3.4 实例3:天天向上的力量 ............................................................................................................................................................................ 16
3.5 字符串类型及其操作 .................................................................................................................................................................................... 17
3.6 字符串类型的格式化 .................................................................................................................................................................................... 17
3.7 实例4:文本进度条 ..................................................................................................................................................................................... 17
程序练习题 ............................................................................................................................................................................................................... 18
第4章 程序的控制结构 ................................................................................................................................................................................................ 21
4.1 程序的基本结构 ............................................................................................................................................................................................. 21
4.2 程序的分支结构 ............................................................................................................................................................................................. 21
4.3 实例5:身体质量指数BMI ...................................................................................................................................................................... 21
4.4 程序的循环结构 ............................................................................................................................................................................................. 21
4.5 模块2:random库的使用 ....................................................................................................................................................................... 22
4.6 实例6:π的计算 ........................................................................................................................................................................................... 22
4.7 程序的异常处理 ............................................................................................................................................................................................. 22
程序练习题 ............................................................................................................................................................................................................... 23
第5章 函数和代码复用 ................................................................................................................................................................................................ 28
5.1 函数的基本使用 ............................................................................................................................................................................................. 28
5.2 函数的参数传递 ............................................................................................................................................................................................. 28
5.3 模块3:datetime库的使用 ..................................................................................................................................................................... 28
5.4 实例7:七段数码管绘制 ............................................................................................................................................................................ 29
第 2 页/共 79 页
5.5 代码复用和模块化设计 ............................................................................................................................................................................... 29
5.6 函数的递归 ...................................................................................................................................................................................................... 29
5.7 实例8:科赫曲线绘制 ................................................................................................................................................................................ 29
5.8 Python内置函数 ........................................................................................................................................................................................... 30
程序练习题 ............................................................................................................................................................................................................... 30
第6章 组合数据类型 ..................................................................................................................................................................................................... 37
6.1 组合数据类型概述 ......................................................................................................................................................................................... 37
6.2 列表类型和操作 ............................................................................................................................................................................................. 37
6.3 实例9:基本统计值计算 ............................................................................................................................................................................ 37
6.4 字典类型和操作 ............................................................................................................................................................................................. 38
6.5 模块4:jieba库的使用 .............................................................................................................................................................................. 38
6.6 实例10:文本词频统计 .............................................................................................................................................................................. 39
6.7 实例11:Python之禅 ............................................................................................................................................................................... 39
程序练习题 ............................................................................................................................................................................................................... 39
第7章 文件和数据格式化 ............................................................................................................................................................................................ 44
7.1 文件的使用 ...................................................................................................................................................................................................... 44
7.2 模块5:PIL库的使用 .................................................................................................................................................................................. 44
7.3 实例12:图像的字符画绘制 .................................................................................................................................................................... 44
7.4 一二维数据的格式化和处理 ...................................................................................................................................................................... 45
7.5 实例13:CSV格式的HTML展示 ......................................................................................................................................................... 45
7.6 高维数据的格式化 ......................................................................................................................................................................................... 45
7.7 模块6:json库的使用 ............................................................................................................................................................................... 45
7.8 实例14:CSV和JSON格式相互转换 ................................................................................................................................................. 46
程序练习题 ............................................................................................................................................................................................................... 46
第8章 程序设计方法论 ................................................................................................................................................................................................ 55
8.1 计算思维 ........................................................................................................................................................................................................... 55
8.2 实例15:体育竞技分析 .............................................................................................................................................................................. 55
8.3 自顶向下和自顶向上 .................................................................................................................................................................................... 55
8.4 模块7:pyinstaller库的使用 .................................................................................................................................................................. 55
8.5 计算生态和模块编程 .................................................................................................................................................................................... 56
8.6 Python第三方库的安装.............................................................................................................................................................................. 56
8.7 实例16:pip安装脚本............................................................................................................................................................................... 56
程序练习题 ............................................................................................................................................................................................................... 56
第9章 科学计算和可视化 ............................................................................................................................................................................................ 66
9.1 问题概述 ........................................................................................................................................................................................................... 66
9.2 模块8:numpy库的使用 ......................................................................................................................................................................... 66
9.3 实例17:图像的手绘效果 ......................................................................................................................................................................... 66
9.4 模块9:matplotlib库的使用 .................................................................................................................................................................. 66
9.5 实例18:科学坐标图绘制 ......................................................................................................................................................................... 67
9.6 实例19:多级雷达图绘制 ......................................................................................................................................................................... 67
程序练习题 ............................................................................................................................................................................................................... 67
第10章 网络爬虫和自动化 ......................................................................................................................................................................................... 70
10.1 问题概述 ........................................................................................................................................................................................................ 70
10.2 模块10:requests库的使用 ................................................................................................................................................................ 70
第 3 页/共 79 页
10.3 模块11:beautifulsoup4库的使用 .................................................................................................................................................. 70
10.4 实例20:中国大学排名爬虫 .................................................................................................................................................................. 70
程序练习题 ............................................................................................................................................................................................................... 71
第 4 页/共 79 页
第1章 程序设计基本方法
1.1 计算机的概念
[1.1]: 计算机是根据指令操作数据的设备,它的两个显著特点是功能性和可编程性。
[1.2]: 吉尔德定律(Gilder’s Law):主干网的带宽每6个月增长一倍;
梅特卡尔夫定律(Metcalfe’s Law):网络的价值同用户数量的平方成正比;
库梅定律(Koomey’s Law):每18个月相同计算量所需要消耗的能量会减少一半;
尼尔森定律(Nielsen’s Law):用户带宽将以平均每年50%的增幅增长。
[1.3]: 近十年提出的技术名词有普适计算、云计算、物联网、深度学习、量子计算、大数
据、区块链、边缘计算、软件定义网络等。
1.2 程序设计语言
[1.4]: 机器语言,也就是二进制代码语言,全部由0和1组成。
[1.5]: 编译执行: 优点:编译产生的目标代码执行更快,在同类型操作系统上使用灵活;
缺点:对不同类型操作系统支持较差,比如windows和linux;
解释执行: 优点:可在不同类型操作系统上运行,源代码保留,方便纠错与维护;
缺点: 执行效率较低,源代码保留使程序容易遭到破坏。
[1.6]: 工作中处理数据、方便及时获取信息、创造新的工作机会等。
1.3 Python语言概述
[1.7]: 降低学习成本、有利于程序演进、推动了互联网的进步。
[1.8]: 平台无关,粘性扩展,强制可读,支持中文,模式多样,类库丰富等。
[1.9]: print("祖国,你好")
1.4 Python语言开发环境配置
[1.10]: 在print()参数列表中添加end = "",表示以空字符结尾,替换默认的换行结尾。
第 5 页/共 79 页
[1.11]: 可以使用turtle库绘制图形
[1.12]: 可以使用datetime或time库来获取日期时间
1.5 程序的基本编写方法
[1.13]: Input: 给出一个问题及回答者的答案
Process: 将回答者答案与人类答案进行比较
Output: 回答者是人或计算机
[1.14]: Python语言能够帮助求解问题中的计算部分。
[1.15]: 调试指排除程序错误,此时程序输出是不正确的。测试指在程序正确输出后对其他
特性诸如性能,安全性进行进一步探究和改进,此时程序的输出是正确的。
[1.16]: B
1.6 Python语言的版本更迭
[1.17]: Python 2输出是print "祖国,你好",Python 3输出是print("祖国,你好")。
[1.18]: Python 2中的input()返回类型取决于输入类型,Python 3中无论输入什么,input()返
回的都是字符串。
[1.19]: (1) 观察它们的print用法
(2) 代码中有from __future__ import xxxxxx,一定是2.x;
(3) 代码中有中文变量名,一定是3.x。
程序练习题
本章程序练习题为代码测试类型,只需要读者按照题干要求录入代码运行代码即可,无需
答案。
第 6 页/共 79 页
第2章 Python程序实例解析
2.1 实例1:温度转换
[2.1]: (1) 收支记录:公司所有部门的收支记录采用计算机录入并管理;
(2) 分析比较:对收支历史数据进行比较分析;
(3) 财务审计:计算机辅助找到财务漏洞。
Input: 《红楼梦》全文;
Process:对全文分词,找到其中的人物名称,统计人物名称出现的次数并排序;
Output:按照从高到低顺序输出排序后的人物名称。
[2.2]:
[2.3]: 模糊或主观性很强的问题、鉴赏类问题、纠纷类问题等。
2.2 Python程序语法元素分析
[2.4]: C
[2.5]: 出现过的保留字:
没有出现的保留字:
lambda:生成简写函数的lambda表达式;
as:名称转换;
is:表示“是”,用于表达式操作;
or:表示“或”,用于逻辑或和表达式运算;
第 7 页/共 79 页
import、from:用于导入模块;
in:判断变量是否在序列中;
not:表示“不是”,可用于逻辑非操作,表达式运算;
and:表达式运算,逻辑与操作;
if、elif、else:分支语句;
while:用于循环;
def:定义函数或方法;
for:用于循环;
try、except、finally:用于异常捕捉及处理;
with:用于上下文管理;
assert:表示断言,用于判断一个变量或一个表达式的值是否为真;
break:表示中断;
class:用于定义类;
continue:用于执行下一次循环;
del:用于删除变量或序列的值;
return:用于函数返回结果;
yield:用于从函数依次返回值;
raise:用于抛出异常;
nonlocal:用于函数嵌套定义时外层数据在内层的表示;
global:表示全局变量;
None:表示“空”;
True:表示“真”;
False:表示“假”;
[2.6]: print(input())。
[2.7]: 如果允许变量名开头是数字,则无法区分变量名和数字类型,例如:如果变量名091
合法,则程序无法区分这个变量和数字091。另外,有些数字可能含有字母,如浮点数1E10。
程序设计语言不能存在歧义,因此,需要约定变量名开头不能是数字,以便区分变量与数字。
2.3 实例2:Python蟒蛇绘制
[2.8]: 颜色由紫色变为紫罗兰色,看起来变浅了。
[2.9]: 蟒蛇的长度变长了。
[2.10]: 画笔在一开始的平移时画出了一条细线。因为注释了penup()后,画笔不会抬起,
每次移动都相当于画线。
2.4 turtle库语法元素分析
[2.11]:
第 8 页/共 79 页
1
import turtle
2
(50)
[2.12]:
1 import turtle
2 (40)
[2.13]:
1 import turtle
2 for i in range(9):
3 (10 + 10*i)
4 (90)
5 ()
6 (10)
7 n()
8 (90)
程序练习题
[2.1]: 将原程序改写为两个独立程序,如下:
1 temp = eval(input("请直接输入华氏温度值: "))
2 C = (temp - 32)/1.8
3 print("转换后的温度是{}C".format(int(C)))
1 temp = eval(input("请直接输入摄氏温度值: "))
2 F = 1.8*temp + 32
3 print("转换后的温度是{}F".format(int(F)))
[2.2]:
1 try:
2 while 1:
3 money=input("请输入要转换的金额,例子:$2/¥6的形式,e退出:")
4 mode=money[0]
第 9 页/共 79 页
5 if mode == '$':
6 val=eval(money[1:])
7 trans=val*6
8 print('{}->>¥{}'.format(money,trans))
9 elif mode == '¥':
10 val=eval(money[1:])
11 trans=val/6
12 print('{}->>${}'.format(money,trans))
13 elif mode =='e':
14 break
15 else:
16 print("您输入的有误")
17 except:
18 print("您输入的有误")
19
[2.3]:
1 import turtle
2
3 def Snake1(rader, angle, leng):
4 for i in range(leng):
5 (rader, angle)
6 (-rader, angle)
7
8 def Snake2(rader,angle, neck):
9 (rader, angle/2)
10 (rader)
11 (neck + 1, 180)
12 (rader * 2/3)
13
14 def main():
15 (1200, 200, 0, 0)
16 '''(180)
17 ()
第 10 页/共 79 页
18 fd(400)
19 (0)
20 ()'''
21 size = 30
22 e(size)
23 (-40)
24 or("yellow")
25 Snake1(40, 80, 1)
26 or("black")
27 Snake1(40, 80, 1)
28 or("pink")
29 Snake1(40, 80, 1)
30 or("blue")
31 Snake1(40, 80, 1)
32 or("red")
33 Snake2(40, 80, size/2)
34
35 main()
[2.4]:
1 from turtle import *
2 setup(500,500)
3 fd(100)
4 left(120)
5 fd(100)
6 left(120)
7 fd(100)
[2.5]:
1 from turtle import *
2 fd(100)
3 seth(-120)
4 fd(100)
第 11 页/共 79 页
5 seth(120)
6 fd(100)
7 seth(60)
8 fd(100)
9 seth(-60)
10 fd(200)
11 seth(-180)
12 fd(200)
13 seth(60)
14
fd(100)
[2.6]:
1 from turtle import *
2 setup(500,500)
3 for i in range(4):
4 up()
5 fd(20)
6 pd()
7 fd(160)
8 up()
9 fd(20)
10
right(90)
[2.7]:
1 from turtle import *
2 up()
3 setpos(-150,20)
4 down()
5 left(30)
6 fd(100)
7 left(60)
8 for i in range(5):
9 fd(100)
第 12 页/共 79 页
10 right(120)
11 fd(100)
12 left(60)
13 fd(100)
14 right(120)
15 fd(100)
16 for n in range(6):
17 fd(100)
18 right(60)
[2.8]:
1 from turtle import *
2 left(90)
3 length = 5
4 speed = 20
5 for i in range(30):
6 fd(length)
7 left(90)
8 fd(length)
9 left(90)
10 length += 5
11 fd(length)
[2.9]:
1 from turtle import *
2 setup
3 colormode(255)
4 pensize(20)
5 pencolor(255,255,255)
6 speed(1000)
7 def changedraw():
8 penr=254
9 for i in range(100):
第 13 页/共 79 页
10 circle(100,1)
11 penr-=1
12 pencolor((penr,penr-1,penr-2))
13 for u in range(100):
14 circle(-100,1)
15 penr-=1
16 pencolor((penr,penr-1,penr-2))
17
changedraw()
第 14 页/共 79 页
第3章 基本数据类型
3.1 数字类型
[3.1]: 因为Python的整数取值不设限,只受配置影响;浮点数却有限制,最大浮点数是
1.7976931348623157e+308。也就是说,如果没有整数数据类型,超过1.7976931348623157e+308
的整数将无法计算。
[3.2]: 分别是0b1111110010,01762,0x3f2。
[3.3]: -7.700000e+01,0.0043 。
[3.4]: 实部是2300.0,虚部是-0.00134,使用.real提取实部,使用.imag提取虚部。
3.2 数字类型的操作
[3.5]:
(1) 21
(2) 1
(3) 256
(4) (-2.5+5j)
[3.6]:
(1) x=(2**4+7–3*4)/5=2
(2) x=(1+3**2)*(16%7)/7=2
[3.7]: 28
3.3 模块1:math库的使用
[3.8]:
(1) -2.4492935982947064e-16 (2) -3.0
(3) 1.0
(5) 4.0
(7) 3
(4) 3.0
(6) 1.0
(8) 1.0
第 15 页/共 79 页
[3.9]: rad = s(47)。
[3.10]: deg = s(/7)。
[3.11]: 随用随学。
3.4 实例3:天天向上的力量
[e3.12]:
N
年
终
值
0.0
1
8.
0.0
2
62.
0.03
0.04
481.
93
3630.
51
0.05
26826
.47
0.06
194502
.79
0.07
138423
4.08
0.08
967308
2.61
0.09
6639541
1.91
0.10
44778670
8.14
00
72
[e3.13]:
N
0.0
1
.2
0.0
2
172.
20
0.03
0.04
2176
.10
2683
2.94
0.05
32301
1.33
0.06
37977
37.73
0.07
436296
97.13
0.08
4899778
26.20
0.09
5381328
010.04
0.10
57822669
934.25
年
13
终
值
9
[e3.14]:
N
0.0
1
0.0
2
482
.23
0.03
0.04
1012
0.78
2062
0.05
40837
0.06
78601
0.07
147142
0.08
2680474
6968.59
0.09
4754089
54402.99
0.10
82133015
72628.78
年
22
终
.3
值
0
53.75
70.33
342.29
6718.46
[e3.15]:
N
0.01
0.02
0.03
0.04
年
终
值
0.05
0.06
0.07
0.08
0.09
0.10
3.4
7
11.8
9
40.2
4
134.6
4
445.3
1
1456.2
4
4709.4
7
15065.0
1
47677.3
6
149308.
88
第 16 页/共 79 页
3.5 字符串类型及其操作
[3.16]: 分别是'helloworld','d','llowor','hold','lrowolleh'。
[3.17]: 不对,此时“4”,“5”都是字符串,加号表示字符串连接。
[3.18]: 还可以进行数制转换,比如十进制转16进制,代码为:
1 x16 = 'abcdef'
2 x = int(input("请输入一个正的十六进制数:"))
3 out = ''
4 if x is 0:
5 print('结果是0x0')
6 else:
7
8
9
10
11
while x:
r = int(x%16);
x = (x-r)/16;
out = str(x16[r]) + out
print('结果是0x' + out)
[3.19]: 分别是'PYTHON STRING', 'python string',10,'Python Strgni',['Python', 'String']。
[3.20]: D
3.6 字符串类型的格式化
[3.21]: _ _ _ _ _ _ _ _ _length:23.88_ _ _,(此时“length”前面有9个空格,23.88后面有
3个空格)。
[3.22]: print('{0:b},{0:o},{0:d},{0:x},{0:c}'.format(389)) 110000101,605,389,185,ƅ
[3.23]: 科学记数法: print('%e' %0.002178) 2.178000e-03;
保留4位有效位:print('%4f' %0.002178) 0.002178;
百分形式: print('%f%%' % (0.002178*100)) 0.217800%。
3.7 实例4:文本进度条
[3.24]: 设备方面:使用性能更强的处理器;或使用固态硬盘等设备提高计算机整体速度。
第 17 页/共 79 页
软件自身:在编写时进行代码优化。编译时采用静态编译(Python不存在编译的问
题)。
[3.25]: ()使用的语法为(width[, fillchar]),其功能是返回一个指定的宽度
width 居中的字符串,fillchar 为填充的字符,默认为空格。
[3.26]: 针对本节程序,将转义符r放到字符串尾部是对程序没有影响;然而如果放到其他
地方,会导致r前面的所有字符不显示,因为每次输出到r,指针又退回了行首,如果后面的
内容足够长,后面的内容会将其覆盖。
程序练习题
[3.1]:
1 weight=eval(input("请输入您当前的体重:(kg)-"))
2 wei10ear =0.5*10+weight
3 wei10moo=wei10ear*0.165
4 print("10年后您在地球的体重为{:.2f},在月球上的体重为
5 {:.2f}".format(wei10ear,wei10moo))
[3.2]:
1 dayup = 1
2 dayfactor = 0.01
3 for j in range(1,366):
4
5
if j % 7 in [4,5,6,0]:
dayup = dayup * (1 + dayfactor)
6 print('%f the result is %.2f' %(dayfactor, dayup))
[3.3]:
1 dayup = 1
2 dayfactor = 0.01
3 period = [4,5,6,0]
4 decrease = 0
5 for j in range(1,366):
6
7
temp = j - decrease
tom = temp % 7
第 18 页/共 79 页
8
9
10
11
12
if j%10 == 0:
decrease += j - (tom - 1)
tom = 1
if tom in period:
dayup = dayup * (1 + dayfactor)
13 print('%f the result is %.2f' %(dayfactor, dayup))
[3.4]:
1 while 1:
2 hui=input("请输入一个五位数或用e退出:")
3 if len(hui) == 5 :
4 if eval(hui)==eval(hui[-
5 1:]+hui[3:4]+hui[2:3]+hui[1:2]+hui[0:1]):
6 print("这是一个回文数")
7 else:
8 print("这不是一个回文数")
9 elif hui[-1:] in ['e','E']:
10 break
11 else:
12 print("您的输入有误")
[3.5]:
1 for i in range(11):
2 if i in [0,5,10]:
3 print("+ - - - - + - - - - +")
4 else:
5 print("| | |")
[3.6]:
1 from time import sleep
2 print("Starting",end="")
3 for i in range(10):
4 print("..",end="")
第 19 页/共 79 页
5 sleep(0.5)
6 print("Done!")
[3.7]:
1 while 1:
2 for i in ["/","-","|","","|"]:
3 print("%sr" % i ,end="")
[3.8]:
1 from tqdm import tqdm
2 from time import sleep
3 for i in tqdm(range(1,100)):
4 print("")
5 sleep(0.3)
第 20 页/共 79 页
第4章 程序的控制结构
4.1 程序的基本结构
[4.1]: 正确。
[4.2]: 错误。
[4.3]: A
[4.4]: B
4.2 程序的分支结构
[4.5]: 错误。
[4.7]: 错误。
[4.8]: B
[4.9]: 输出Grade为D,不符合逻辑。因为输入满足多分支第一个条件,执行后跳出了整
个多分支。应该将成绩从高到低作为判断条件。
4.3 实例5:身体质量指数BMI
[4.10]: 因为没必要,上一个条件的上限恰好是下一个条件的下限,各个区间是相连的。不
存在冲突。
[4.11]: 正确。这个语句的运算顺序是24<=(28<25), 其中28<25的运算结果为False,然后
计算24<=False,相当于计算24<=0,输出False。
[4.12]: 语句换行,表示下一行与上一行是同一行语句。
4.4 程序的循环结构
[4.13]: 正确。
[4.14]: 错误。
[4.15]: 错误,死循环在维持系统运行方面有很重要的作用。
第 21 页/共 79 页
[4.16]: D
[4.17]: B
4.5 模块2:random库的使用
[4.18]:
(1) for i in range(10):
print(randint(0,100) )
(2) randrange(1,100,2)
(3) s =
'abcdefghij'
for i in range(4):
print(s[randint(0,len(s)-1)])
(4) print(['apple', 'pear', 'peach', 'orange'][randint(0, 3)])
4.6 实例6:π的计算
[4.19]: DARTS = 10000000时,准确率比较高,结果是3.1420104。
[4.20]: 将第11句改为dist <= 2.0,这样无论xy怎样变化,它们的平方和始终小于2,结
果也是一样的,虽然是错的。
[4.21]: (1) 蒙特卡罗搜索树。下过围棋的同学都知道棋手的水平取决于他能够推演的步数,
专业棋手一般能推演十几步以上,然而这个看似简单的东西对早期计算机来说是个噩梦。因此
在机器围棋领域,出现了一种算法叫蒙特卡罗搜索树,它就是运用了蒙特卡罗方法来缩小计算
机的搜索范围。从而使计算机拥有与人类棋手匹敌的推演步数。
(2) 蒙特卡罗积分等。
4.7 程序的异常处理
[4.22]: try语句块中放置想要检测的部分;except语句块中放置想要捕获的异常,以及出
现异常后的处理;else语句块中放置不出现异常时要执行的部分;finally语句块中放置无论如
何都必须执行的部分,常用在使程序继续执行。
[4.23]:
第 22 页/共 79 页
1 try:
2 s = input()
3 except Exception:
[4.24]: 使用if -else来判断用户输入的合规性。
程序练习题
[4.1]:
1 from random import randint
2 num=randint(1,10)
3 tim=0
4 while 1:
5 try:
6 putnum=eval(input("请输入您猜测的数字:"))
7 tim+=1
8 if putnum > num:
9 print("遗憾!太大了")
10 elif putnum 11 print("遗憾!太小了") 12 elif putnum==num: 13 print("预测{}次,你猜中了!".format(tim)) 14 break 15 except: 16 print("输入有误!") [4.2]: 1 stri=input("请输入您想要的字符串:") 2 kong=0 3 alpha=0 4 chi=0 5 num=0 6 other=0 第 23 页/共 79 页 7 for i in stri: 8 if i == " ": 9 kong +=1 10 elif '0' <= i <= '9': 11 num+=1 12 elif i>=u'u4e00' and i<=u'u9fa5': 13 chi+=1 14 elif True == a(): 15 alpha+=1 16 else: 17 other+=1 18 print("您输入的字符串中有{}个空格,{}个数字,{}个中文,{}个英文字符,{} 19 个其他字符".format(kong,num,chi,alpha,other)) [4.3]: 1 a,b=eval(input("请输入两个整数,中间用,隔开:")) 2 c=a*b 3 if a 4 a,b=b,a 5 while False == (a in[0,1]): 6 b,a=a,b%a 7 c=c/b 8 print("最小公约数为:{},最大公倍数为:{}".format(b,c)) [4.4]: 1 from random import * 2 seed(100) 3 num=randint(0,100) 4 tim=0 5 while 1: 6 try: 7 putnum=eval(input("请输入您猜测的数字:")) 8 tim+=1 9 if putnum > num: 第 24 页/共 79 页 10 print("遗憾!太大了") 11 elif putnum 12 print("遗憾!太小了") 13 elif putnum==num: 14 print("预测{}次,你猜中了!".format(tim)) 15 break 16 except: 17 print("输入有误!") [4.5]: 1 from random import * 2 import types 3 seed(100) 4 num=randint(0,100) 5 tim=0 6 while 1: 7 try: 8 putnum=eval(input("请输入您猜测的数字:")) 9 if type(putnum) == type(1): 10 tim+=1 11 if putnum > num: 12 print("遗憾!太大了") 13 elif putnum 14 print("遗憾!太小了") 15 elif putnum==num: 16 print("预测{}次,你猜中了!".format(tim)) 17 break 18 else: 19 print("输入内容必须为整数!") 20 except: 21 print("输入有误!") [4.6]: 第 25 页/共 79 页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import random times = eval(input("请输入你希望模拟的次数:")) pick_first_n = 0 pick_change_n = 0 for i in range(times): car = t(0, 2) #生成哪个门后藏车 pick_first = t(0, 2) #初始随机选一个 if pick_first == car: #如果直接选中,则初始选择正确, pick_first_n 加 1,换选择一定不中 pick_first_n += 1 else: #如果初始选择没中,则主持人打开另一扇没车的门 后,换选择一定中 pick_change_n += 1 #故 pick_change_n 加 1 pick_first_percent = pick_first_n / times #计算坚持不换选择的 胜率 pick_change_percent = pick_change_n / times #计算换选择的胜率 print("如果坚持初选,胜率为{:.2f}%".format(pick_first_percent * 100)) print("如果改变初选,胜率为{:.2f}%".format(pick_change_percent * 100)) 25 [4.7]: 1 TempStr = input('请输入带有符号的温度值:') 2 if TempStr[-1] in ['F','f']: 3 4 5 6 7 try: C = (eval(TempStr[:-1]) - 32)/1.8 print('转换后的温度是{:.2f}C'.format(C)) except: print('您输入的温度格式有误!') 第 26 页/共 79 页 8 elif TempStr[-1] in ['C','c']: 9 10 11 12 13 try: F = 1.8 * (eval(TempStr[:-1])) + 32 print('转换后的温度是{:.2f}F'.format(F)) except: print('您输入的温度格式有误!') 14 else: 15 print('您输入的温度格式有误!') 第 27 页/共 79 页 第5章 函数和代码复用 5.1 函数的基本使用 [5.1]: A [5.2]: D [5.3]: 错误。 [5.4]: 合法,因为Python语言是解释执行,即只要在真正调用函数之前定义函数,都可以 进行合法调用。 5.2 函数的参数传递 [5.5]: 在函数定义时,直接为可选参数指定默认值。可选参数必须定义在非可选参数后面, 可选参数可以有多个。 [5.6]: 在函数定义时,可变参数通过在参数前增加星号(*)实现。可变数量参数只能在参 数列表最后,即它只能有一个。 [5.7]: 返回值是元组类型。 [5.8]: 位置传递:支持可变数量参数,但容易忘记实参的含义; 名称传递:不易忘记实参的含义,但不支持可变数量参数。 [5.9]: 如果函数里没有创建同名变量,则可以直接使用,不需global声明。 5.3 模块3:datetime库的使用 [5.10]: print( "现在是{0:%Y}年{0:%m}月{0:%d}日 {0:%I}:{0:%M}".format(())) [5.11]: 答案不限。举一个例子,输出美式日期格式: print("{0:%I}:{0:%M} {0:%b} {0:%d} {0:%Y}".format(())) [5.12]: datetime对象可以直接做加减运算,所以可以用这样的方式给程序计时: 1 Start = () 2 ... # 要计时的代码 第 28 页/共 79 页 3 ... 4 End = () 5 Cost = End – Start 6 Print(Cost) 5.4 实例7:七段数码管绘制 [5.13]: 相当于C语言中的三目运算符。 [5.14]: 隐藏画笔的turtle形状。 [5.15]: 对应相应的年月日文字输出。 5.5 代码复用和模块化设计 [5.16]: 错误,因为”使用函数“是“模块化设计“的必要条件。 [5.17]: 错误,过量使用函数会造成运行时频繁出入栈,浪费系统资源。 [5.18]: 可以找出很多,以例子7.1中的情况为例进行阐述。(1) DrawLine与DrawDigit属 于紧耦合的关系, DrawLine一旦改变,DrawDigit内部就要做大幅度更改。(2) DrawData与 turtle中的penup,pendown方法则属于松耦合的关系,无论起笔落笔的方式如何变化,DrawData 一定是在落笔之后的操作,它与起笔落笔没有关系。 5.6 函数的递归 [5.19]: C [5.20]: 数学归纳法,递推式等。 [5.21]: 循环由已知推未知,不断向后;递归由未知寻找已知,不断向前,递归的实质是出 入栈,效率较低。 5.7 实例8:科赫曲线绘制 [5.22]: 改变()中的参数值。 [5.23]: 修改koch()函数,其他部分不变。 第 29 页/共 79 页 1 ... 2 def Koch(size, n) 3 if n ==0: 4 (size) 5 else: 6 for angle in [0, -60, 120, -60]: 7 (angle) 8 koch(size/3, n-1) 9 ... [5.24]: 在设置画笔时加一行or(颜色名称)。 5.8 Python内置函数 [5.25]: 整数type(123), 浮点数type(1E10),字符串type( ' str ' )。 [5.26]: 字符串可以使用len()得到长度,而整数和浮点数不能得到长度,因为它们都是动态 的,没有长度。 [5.27]: 0x400,0x3200, 0x10000。 程序练习题 [5.1]: 1 def drawsq(n): 2 line=3*n+1 3 for i in range(1,line+1): 4 if i%3 ==1: 5 print(n*"+----",end="") 6 print("+") 7 else: 8 print ("| "*n,end="") 9 print("|") 10 11 def main(): 第 30 页/共 79 页 12 n=eval(input("请输入您要的阶数:")) 13 drawsq(n) 14 15 main() [5.2]: 1 def isOdd(num): 2 3 4 5 6 7 8 9 10 11 12 print(isOdd(4)) 13 print(isOdd(3)) 14 print(isOdd(-1)) 15 print(isOdd('str')) 16 print(isOdd(3.)) 17 try: if type(num) == type(0.): raise TypeError if num%2 == 0: return False else: return True except TypeError: print('这不是一个有效的整数!') [5.3]: 1 # python 中合法的数字有十进制整数,浮点数,十六进制整数,复数 2 # --------------------------3 也是合法数字 3 def isNum(num): 4 5 6 7 8 9 np = '+-' numbers = '.' numbersE = '.+-jJEe' x16 = 'abcdefABCDEF' if num[0] in np: 第 31 页/共 79 页 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 try: return isNum(num[1:]) except: return False elif num[0] in numbers: if num[:2] == '0x': # 16进制分支 for i in num[2:]: if i not in x16: return False return True else: ele = 0 point = 0 last = '' numaftere = 0 q = 0 for i in num: q = q+1 if i not in numbersE: return False else: if point == 0 and i == '.': point = 1 continue if point == 1 and (numaftere == 1 or ele == 0) and i in '+-': # 一个数字结束,进入了第二个数字(一般是复数) point = 0 continue if ele == 0 and i in 'Ee': # 出现了第一个E, 一个 浮点数中只能出现一个E ele = 1 continue if ele == 1 and i in '': numaftere = 1 第 32 页/共 79 页 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 continue if ele == 1 and numaftere == 1 and i in '+-': # 针对复数的特例 ele = 0 numaftere = 0 continue if last =='.' and i in '+-': return False elif (point == 1 or last in 'EeJj') and i == '.': # 测试集 print(isNum('Hello')) print(isNum('+++++++++++++++++++++++++++++++++++++')) print(isNum('+-+-+-+-+-+-3')) print(isNum('100')) return False elif i in 'Jj' and last in '+-': return False elif ele == 1 and i in 'Ee.': return False last = i if last == '.' and i in '+-': return False elif (point == 1 or last in 'EeJj') and i == '.': return False elif i in 'Jj' and last in '+-.': return False elif ele == 1 and i in 'Ee.': return False else: return True else: return False 第 33 页/共 79 页 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 print(isNum('10e10')) print(isNum('10e+10')) print(isNum('10e10.')) print(isNum('10e10e')) print(isNum('10e10+4E10')) print(isNum('10e')) print(isNum('10e+1j')) print(isNum('10e10+1.j')) print(isNum('1.0e+10-j')) print(isNum('1.0e+1j-3.e')) print(isNum('1.0e10+1j-3.e10')) print(isNum('1.3333')) print(isNum('.3333')) print(isNum('.333.3')) print(isNum('.3333e5')) print(isNum('12345678')) print(isNum('0abddf')) 95 print(isNum('0xabddf')) [5.4]: 1 def multi(*args): 2 3 4 5 6 7 8 9 10 11 12 sum = 1; count = 1; for i in args: if type(i) is type(1) or type(i) is type(1.): sum *= i else: print('第{}项不是一个有效的整数!'.format(count)) return; count += 1 return sum; 13 print(multi(2,3,1.0,5,4.99)) 14 print(multi(2,1,'str')) 第 34 页/共 79 页 15 print(multi()) [5.5]: 1 def isPrime(num): 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import math try: if type(num) == type(0.): raise TypeError r = int(((num))) except TypeError: print('不是一个有效的整数') return None if num == 1: return False for i in range(2, r+1): if num % i == 0: return False return True 17 print(isPrime(2)) 18 print(isPrime(44)) 19 print(isPrime('str')) 20 print(isPrime(1)) 21 print(isPrime(3.3)) 22 print(isPrime(0x18)) [5.6]: 1 from datetime import datetime 2 3 birthday = datetime(1995,1,1,23,00) 4 print(birthday) 5 print('%s年%s月%s日 6 '%(,,)) 第 35 页/共 79 页 7 print('{0:%Y}-{0:%m}-{0:%d} {0:%a}'.format(birthday)) 8 print('{0:%b}.{0:%d} {0:%Y}'.format(birthday)) 9 print('{0:%d}{1:} {0:%b} {0:%Y}'.format(birthday, 10 ['st','nd','rd','th'][%10-1 if %10<=3 11 else 3])) 第 36 页/共 79 页 第6章 组合数据类型 6.1 组合数据类型概述 [6.1]: 元组的表现形式是引号和小括号,集合的表现形式是引号和大括号;元组是元素不 可更改的特殊列表,集合是无重复元素的无序组合。 元组转集合:set1=set(('key1','key2','key3'))。 集合转元组:tuple1=tuple(set)。 [6.2]: 结果分别是{1,2,3,5,6},{5,6},{1,2,3},{1,3}。 [6.3]: 序列是数值与位置的关系,集合是不重复数值的无序组合,映射是数值与名称的关 系。 6.2 列表类型和操作 [6.4]: 升序sorted(ls),降序sorted(ls, reverse = True)。 [6.5]: ls1>ls2。 [6.6]: ls1=[22,43], ls2=[22,43],因为执行ls2=ls1时,把ls1的引用给了ls2,即ls2始终 指向的时ls1的地址。 [6.7]: 3。 6.3 实例9:基本统计值计算 [6.8]: sorted(numbers, reverse = True)。 [6.9]: 1 def max(numbers): #求最大值 2 3 4 5 max = numbers[0] for i in numbers: if i > max: max = i return max 6 def min(numbers): #求最小值 第 37 页/共 79 页 7 8 9 min = numbers[0] for i in numbers: if i < min: min = i 10 return min [6.10]: 中位数表示大多数居民收入; 平均数表示平均收入。 6.4 字典类型和操作 [6.11]: 错,字典里一个键只对应1个值。 [6.12]: (1) D['钱七'] = 90 (2) D['王五'] = 93 (3) ('赵六') [6.13]: ACDE。B错误,因为列表是可变的,不能作为键使用。 [6.14]: 3。 6.5 模块4:jieba库的使用 [6.15]: 首先在命令行环境下通过pip安装:pip install jieba, 然后使用import jieba。 [6.16]: c = ('中华人民共和国是一个伟大的国家') for i in c: print(i) [6.17]: 例如加入 “给力”这个词: >>>('老师的课太给力了') ['老师', '的', '课太给力', '了'] >>>_word('给力') >>>('老师的课太给力了') [ '老师', '的', '课', '太', '给力', '了'] 第 38 页/共 79 页 6.6 实例10:文本词频统计 [6.18]: 代码中lambda作为一个表达式。在该代码中,lambad相当于: def func(x): return (x[1]) 该函数功能是将列表里每个元素的第二项,也就是出现次数作为排序依据。 [6.19]: 代码10.4第23行的items = list(())。 6.7 实例11:Python之禅 [6.20]: (1) 清晰明了,规范统一; (2) 逻辑简洁,避免复杂逻辑; (3) 接口关系要清晰; (4) 函数功能扁平,避免太多层次嵌套; (5) 间隔要适当,每行代码解决适度问题。 [6.21]: 对字典d进行内容填充,将i+c对应的字符替换为(i+13)%26+c,即将编号循环 增加了13。 程序练习题 [6.1]: 1 from random import randint 2 def rancre(): 3 mi='' 4 for i in range(8): 5 u = randint(0,62) 6 if u>=10: 7 if 90<(u+55)<97: 8 mi+=chr(u+62) 9 else: 10 mi+=chr(u+55) 第 39 页/共 79 页 11 print("{} ".format(u+55),end="") 12 else: 13 mi+='%d'%u 14 return mi 15 16 def main(): 17 for i in range(1,11): 18 print("生成的第{}个密码是:{}".format(i,rancre())) 19 main() [6.2]: 1 def main(): 2 num=[] 3 n=input("请输入一组数字(或者直接按回车结束程序):") 4 while n!="": 5 (eval(n)) 6 n=input("请输入一组数字(或者直接按回车结束程序):") 7 else: 8 print("正在处理,请稍等") 9 judge(num) 10 11 def judge(n): 12 if len(n) == len(set(n)): 13 print("鉴定完毕,没有重复的元素") 14 else: 15 print("有重复的元素,总共有{}个".format(len(n)-len(set(n)))) 16 main() [6.3]: 1 def main(): 2 num=[] 3 n=input("请输入一组数字(或者直接按回车结束程序):") 4 while n!="": 5 (eval(n)) 第 40 页/共 79 页 6 n=input("请输入一组数字(或者直接按回车结束程序):") 7 else: 8 print("正在处理,请稍等") 9 judge(num) 10 11 def judge(n): 12 if len(n) == len(set(n)): 13 print("鉴定完毕,没有重复的元素") 14 else: 15 print("有重复的元素,总共有{}个".format(len(n)-len(set(n)))) 16 main() [6.4]: 1 txt=input("请输入您想输入的英文句子:") 2 counts={} 3 ex=[',','.','?','!',':','"',';'] 4 5 for i in txt: 6 if i == " " or i in ex: 7 continue 8 else: 9 if ord(i)<97: 10 i=chr(ord(i)+32) 11 12 counts[i]=(i,0)+1 13 14 items=list(()) 15 (key=lambda x:x[1],reverse=True) 16 17 for u in range(len(items)): 18 alpha,count=items[u] 19 print("{} -> {}".format(alpha,count)) [6.5]: 第 41 页/共 79 页 1 from random import * 2 3 def randbirth(): 4 mon=randint(1,12) 5 if mon in[1,3,5,7,8,10,12]: 6 day=randint(1,31) 7 elif mon ==2: 8 day=randint(1,28) 9 else: 10 day=randint(1,30) 11 return mon*100+day 12 13 def main(): 14 ls=[] 15 for i in range(23): 16 (randbirth()) 17 if len(ls) == len(set(ls)): 18 return 1 19 else: 20 return 0 21 22 try: 23 poss=0 24 n=eval(input("请输入样本数量:")) 25 for i in range(n): 26 if main() == 1: 27 poss+=1 28 if (poss/n) >= 0.5: 29 print("当房间内的人数为23人时,他们生日几率超过了50%,是 30 {}%".format(poss*100/n)) 31 else: 32 print("当房间内的人数为23人时,他们生日几率没有一半,是 33 {}%".format(poss*100/n)) 34 第 42 页/共 79 页 35except: 36 print("输入有误") [6.6]: 1 import as ps 2 3 # 假设你已经有了红楼梦文本 4 5 txt = open('红楼梦.txt','r',encoding = 'utf-8').read() 6 # exclude = ['什么','那里','一个','我们','你们','如今','说到','知道 7 ','起来','众人','他们','太太','只见','怎么',] 8 exclude = ['明白'] 9 counts = {} 10 11 def countFigures(): 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 countFigures() words = (txt) for w in words: if len() == 1: continue if == 'nr': counts[] = (, 0) + 1 for key in exclude: del(counts[key]) items = list(()) (key = lambda x:x[1], reverse = True) for i in range(20): word, count = items[i] print('{0:<10}{1:>5}'.format(word,count)) 第 43 页/共 79 页 第7章 文件和数据格式化 7.1 文件的使用 [7.1]: open('c:','r')。 [7.2]: 采用读方式,会报出FileNotFoundError异常;采用写方式,会创建此文件。 [7.3]: (30)。 [7.4]: D [7.5]: 提示文件不存在,或者无权限操作。 7.2 模块5:PIL库的使用 [7.6]: Image类主要对图片做基础操作,包括读取,创建,缩放,旋转,保存等; ImageFilter类提供了图像的滤镜器; ImageEnhance类用于图像的增强处理,不仅可以增强(或减弱)图像的亮度、对比度、 色度,还可以用于增强图像的锐度等。 [7.7]: im = () () [7.8]: (1)首先打开图像文件; (2)然后将图像分解为rgb三个通道; (3)对红色通道进行编辑,使其所有颜色值变为0; (4)然后将三个通道重新合并为图像,并保存。 7.3 实例12:图像的字符画绘制 [7.9]: 富于美感的灰色转换:Gray = R*0.299 + G*0.587 + B*0.114; Adobe公司灰色转换:Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2); 苹果公司灰色转换: Gray = (R^1.8 * 0.2446 + G^1.8 * 0.6720 + B^1.8 * 0.0833)^(1/1.8)。 [7.10]: 代码12.1中15-17行。通过一个嵌套的循环,外层循环确定图片的第i行像素,内 第 44 页/共 79 页 层确定这一行中第j个像素,然后通过getpixel(i,j)获得这个像素。 [7.11]: 返回的是一个元组,元组有三个元素,表示该像素的RGB值;x表示横坐标,y表 示纵坐标。 7.4 一二维数据的格式化和处理 [7.12]: 数据维度是数据 “立体”结构结构中独立坐标的数目, 是用数据描述事物或现象的 特征数目,如性别、地区、时间等都是维度。一维数据一般是线性结构,二维数据一般是表格 数据,高维数据采用对象方式组织。 [7.13]: JSON是一种轻量级的数据交换格式,其实就是将一组数据转化为字符串。它包含 两种数据类型:对象和数组。 [7.14]: 可以支持,对CSV来说,高维相当于对数据分页,只要把几页数据放到一个CSV 里,并在程序中约定好维度,就相当于实现了CSV的高维数据存储。 7.5 实例13:CSV格式的HTML展示 [7.15]: 一个HTML文件一般包含 主体包含所要说明的具体内容。 [7.16]: 将文件中所有出现的回车都替换为空字符。 [7.17]: 将第6行改为bgcolor = 'aqua'。 7.6 高维数据的格式化 [7.18]: 在高维数据中,键值对的键对于值来说相当于“字段”,即标签。 [7.19]: 大括号表示一个对象,中括号表示一个数组。 [7.20]: 一维:用数组表示;二维:一个维度用数组,另一个用对象或数组。 7.7 模块6:json库的使用 [7.21]: sorted_key 用来决定是否对字典中字典项按键进行排序。 [7.22]: 正确。 [7.23]: 正确。 第 45 页/共 79 页 7.8 实例14:CSV和JSON格式相互转换 [7.24]: 通过修改dumps()函数的中参数ensure_ascii默认值使json库输出中文字符,如 dumps(data, ensure_ascii = False)。 [7.25]: zip()函数可以将两个长度相等的列表组合成一个关系对,该函数非常适合生成键 值对。 [7.26]: 列表用于未知值查找,或已知值求位置,查找广泛;字典只能用于已知键查找值, 查找精确。 程序练习题 [7.1]: 1 import keyword 2 3 stopwords = 'tnr: ()' 4 functionwords = '.(' 5 word = [] 6 output = '' 7 lastAvailable = ['from', 'import'] 8 last = False 9 10 def readFile(path): 11 12 13 14 15 file = open(path,'r',encoding = 'utf-8') string = () return string[1:] 16 def parse(string): 17 18 19 20 21 global word global output for i in string: if i in stopwords: wd = ''.join(word) 第 46 页/共 79 页 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 res = isKeyWord(wd) if res == False: if i not in functionwords and last == False: wd = () if wd in lastAvailable: last = True else: last = False output += wd output += i word = [] else: (i) 37 def isKeyWord(string): 38 39 40 41 42 43 def outPutFile(): 44 45 46 file = open('D:','w',encoding = 'utf-8') (output) if string in : return True return False 47 string = readFile('D:') 48 parse(string) 49 outPutFile() [7.2]: 1 from PIL import Image 2 import os 3 import math 第 47 页/共 79 页 4 def getsize(path): 5 6 7 def compress(path): 8 9 10 11 12 13 14 15 16 17 18 19 compress('D:') ('test_',) size = getsize(path) ratio = (10*1024/size) im = (path) height = ; width = ; m_height = int(ratio*height) m_width = int(ratio*width) ph = ((m_width, m_height)) return (path).st_size [7.3]: 1 from PIL import Image 2 unicode_char = list('') 3 4 def get_char(r,b,j, alpha = 256): 5 6 7 8 9 10 11 12 def main(filename): 13 14 15 im = (filename) WIDTH, HEIGHT = 100,60 im = ((WIDTH, HEIGHT)) 第 48 页/共 79 页 if alpha == 0: return ' ' gray = int(0.2126*r + 0.7152*g + 0.0722*b) unit = 256/len(ascii_char) return unicode_char[int(gray // unit)] 16 17 18 19 20 21 22 23 txt = '' for i in range(HEIGHT): for j in range(WIDTH): txt += get_char(*el((j,i)) txt += 'n' fo = open('pic_'+filename + 'txt', 'w') (txt) () 24 main(filename) [7.4]: 1 import json 2 f = open("",'r') 3 lister=[] 4 for line in f: 5 line = e("[","") 6 line = e("]","") 7 line = e(" ","") 8 line = e("n","") 9 for i in ("'"): 10 if i != ',': 11 (i) 12 f2 = open('','w') 13 for r in range(1,len(lister)): 14 lister[r]=dict(zip(lister[0],lister[r])) 15 (lister[1:],f2,sort_keys=True,indent=4,ensure_ascii=Fa 16 lse) 17 print('转换完成') 18 () 19 () [7.5]: 1 dict = {} 第 49 页/共 79 页 2 digits = '' 3 path = '' 4 5 def readFile(path, arg): 6 7 8 9 10 11 12 13 14 def readWords(): 15 16 17 18 19 20 21 22 23 24 def writeFile(word,dsp): 25 26 27 28 29 def modifyFile(word, dsp): 30 31 32 33 34 35 file = readFile(path, 'r') line = nes() flen = len(line) - 1 for i in range(flen): if word in line[i]: () file = readFile(path, 'a') ('{} {}n'.format(word, dsp)) () file = readFile(path, 'r') while True: line = ne() if not line: break try: file = open(path,arg,encoding = 'GBK') except: file = open(path,'w',encoding = 'GBK') return file word = (' ',2) dict[word[0]] = word[1][:-1] () 第 50 页/共 79 页 36 37 38 39 40 41 line[i] = '{} {}n'.format(word, dsp) file = readFile(path, 'w') ines(line) break () 42 def editMode(): 43 44 45 46 47 48 49 print('*'*50) print('*'*50) while True: word = input("(按数字键退出)请输入您想添加或修改的单词:") if word in digits: print('*'*50) print('*'*50) return 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 try: print('该单词已存在于单词库,当前解释是: {}'.format(dict[word])) except: print('您添加的是一个新单词') print('---------------------------------') description = input('请输入您的解释:n') try: dict[word] += ',%s'%description modifyFile(word, dict[word]) except KeyError: dict[word] = '%s'%description writeFile(word, dict[word]) print('----------添加完成--------------') def searchMode(): print('*'*50) print('*'*50) while True: 第 51 页/共 79 页 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 word = input("(按数字键退出)想查的单词:") if word in digits: print('*'*50) print('*'*50) return print('---------------------------------') try: print(dict[word]) except KeyError: print('对不起,这个单词没有收录') print('---------------------------------') def interface(): readWords() def switch(option): funcdic = { } return funcdic[option]() 1:lambda: searchMode(), 2:lambda: editMode(), 3:lambda: exit() while True: print('----------欢迎使用英汉词典----------') print('1.查询单词n2.添加单词n3.退出n') option = int(input('请输入您的选择:')) switch(option) 97 interface() [7.6]: 1 dict = {} 2 file = None 3 digits = '' 4 第 52 页/共 79 页 5 def readWords(): 6 7 global file file = open('C:UsersGMDesktop补充单 8 词.txt','r',encoding = 'GBK') 9 10 11 def editMode(): 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 print('*'*50) print('*'*50) while True: word = input("(按数字键退出)请输入您想添加或修改的单词:") if word in digits: print('*'*50) print('*'*50) return string = () print('---------------------------------') description = input('请输入您的解释:n') try: dict[word] += ',%s'%description except KeyError: dict[word] = '%s'%description print('----------添加完成--------------') 28 def searchMode(): 29 30 31 32 33 34 35 36 37 38 print('*'*50) print('*'*50) while True: word = input("(按数字键退出)想查的单词:") if word in digits: print('*'*50) print('*'*50) return print('---------------------------------') try: 第 53 页/共 79 页 39 40 41 42 43 print(dict[word]) except KeyError: print('对不起,这个单词没有收录') print('---------------------------------') 44 def interface(): 45 46 47 48 49 50 51 52 53 54 55 56 57 def switch(option): funcdic = { } return funcdic[option]() 1:lambda: searchMode(), 2:lambda: editMode(), 3:lambda: exit() while True: print('----------欢迎使用英汉词典----------') print('1.查询单词n2.添加单词n3.退出n') option = int(input('请输入您的选择:')) switch(option) 58 interface() 第 54 页/共 79 页 第8章 程序设计方法论 8.1 计算思维 [8.1]: 抽象和自动化。 [8.2]: 发掘计算特性,抽象计算问题,编程实现问题的自动求解。 [8.3]: D 8.2 实例15:体育竞技分析 [8.4]: 将球员水平抽象为能力值,进而抽象为能力概率;将一次比赛单一化为一次模拟, 进而重复500次。 [8.5]: 经济分析、股票预测、病害防治、交通疏解、模拟战场、电影预演等。 8.3 自顶向下和自顶向上 [8.6]: 自顶向下设计指先从大问题的算法开始,不断地将大问题分解为小问题,设计小问 题接口,用算法关联这些小问题;自底向上执行是指设计完成之后,先各个小部分开始测试, 然后逐步扩大测试范围,最终测试整个程序的可行性;自顶向下的设计模式为后来自底向上执 行提供了条件。 [8.7]: 自顶向下设计的本质思想是抽象、模块化。 [8.8]: C 8.4 模块7:pyinstaller库的使用 [8.9]: -h 查看帮助;-v 查看pyinstaller版本;–D 生成dist目录;-F 在dist文件夹中生 成独立的打包文件; [8.10]: pyinstaller对于包含第三方库的源文件,使用-p添加第三方库所在路径。如果第三 方库由pip安装且在Python环境目录中,则不需要使用-p参数。例如pyinstaller -F -p D:tmppython BlogsToWordpresslibs 第 55 页/共 79 页 [8.11]: 优点:不再受解释器限制,源代码得到了保护;缺点:打包后体积过大,因为包含 了库。 8.5 计算生态和模块编程 [8.12]: 参见/pypi [8.13]: 模块编程指主张利用第三方库或开源代码作为程序的部分或全部模块来编程。 [8.14]: 图像格式分析、图像处理基础、聚类方法等。 8.6 Python第三方库的安装 [8.15]: 最常用的一般是list,install,search,uninstall。 [8.16]: (1)可以下载whl文件,然后在路径下,用pip安装。 (2)可以直接从网上下载py文件,拷贝到python安装路径的第三方库目录下。 (3)可以在代码中使用('引用模块的地址')方式添加 [8.17]: 例如安装numpy + mkl : pip install numpy-1.11.2+mkl-cp35-cp35m-win_。 8.7 实例16:pip安装脚本 [8.18]: 当Python2.x 与Python3.x同时存在于系统中时,pip install 默认是给Python 2.x进 行安装,因此需要pip3 来区分针对Python3.x的安装。 [8.19]: (command) 的作用是由Python间接调用系统的终端(即windows下 )来执行给出的command。返回的是终端的输出结果。 [8.20]: 比如BeautifulSoup库,用来分析网页非常棒。 程序练习题 [8.1]: 1 from random import random 2 def getInputs(): 3 4 5 # 乒乓球规则是一局比赛中先得11分为胜,10平时,先得2分为胜 # 一场比赛采用三局两胜,当每人各赢一局时,最后一局为决胜局 第 56 页/共 79 页 6 7 8 9 probA = float(input("请输入选手A的能力值(0-1):")) probB = float(input("请输入选手B的能力值(0-1):")) return probA, probB 10 def simOneGame(probA, probB): 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 scoreA, scoreB = 0,0 serving = 'A' i = 1; while not gameOver(scoreA, scoreB): if serving is 'A': if random() < probA: scoreA += 1 serving = switchServing(i, serving) i += 1 else: scoreB += 1 else: if random() < probB: scoreB += 1 else: scoreA += 1 print(scoreA,'--',scoreB) return Winner(scoreA, scoreB) 32 def gameOver(scoreA, scoreB): 33 34 35 36 37 38 39 if scoreA == 10 & scoreB == 10: return False elif scoreA == 12 or scoreB == 12: return True else: return scoreA == 11 or scoreB == 11 第 57 页/共 79 页 40 def switchServing(i, serving): 41 42 43 44 45 46 47 48 def Winner(scoreA, scoreB): 49 50 51 52 53 54 55 56 57 if scoreA == 12 or scoreB == 12: if scoreA == 12: return 'A' if i%5 == 0 and i > 0: if serving is 'A': serving = 'B' else: serving = 'A' return serving else: return 'B' else: if scoreA == 11: return 'A' else: return 'B' 58 59 60 def simOneChampion(): 61 62 63 64 65 66 67 68 69 70 71 72 B = 0; A = 0; round = 1 probA, probB = getInputs(); while True: print('第{}局'.format(round)) r = simOneGame(probA, probB) round += 1 if r is 'A': A += 1 else: B += 1 73 第 58 页/共 79 页 74 75 76 77 78 79 80 81 82 83 if A == 2: print('A获胜') break elif B == 2: print('B获胜') break else: continue 84 simOneChampion() [8.2]: 1 2 3 4 5 6 7 8 9 from random import random countdown = 0; def getInputs(): while True: try: foulAscore,probA,probA3 = input('请输入A队的参数,用 逗号隔开').split(',') foulBscore,probB,probB3 = input("请输入B队的参数,用 10 逗号隔开").split(',') 11 12 13 14 15 16 17 18 19 20 21 foulAscore = float(foulAscore) foulBscore = float(foulBscore) probA = float(probA) probB = float(probB) probA3 = float(probA3) probB3 = float(probB3) break except: print('您的输入有误,请重新输入') continue (foulAscore,probA,probA3), 第 59 页/共 79 页 return 22 (foulBscore,probB,probB3) 23 def foul(scoreA, scoreB, foulAscore, foulBscore): 24 25 26 27 28 29 30 31 32 33 34 35 36 side = random() if side > 0.5: if scoreA > random(): scoreA += 1 else: scoreB += 1 else: if scoreB > random(): scoreB += 1 else: scoreA += 1 return scoreA, scoreB 37 def simOneGame(argA, argB, ser): 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 global countdown scoreA, scoreB = 0,0 fawl = 0.3 serving = ser i = 1; countdown = 50 foulAscore = argA[0] probA = argA[1] probA3 = argA[2] foulBscore = argB[0] probB = argB[1] probB3 = argB[2] while not gameOver(scoreA, scoreB): judge = random() if judge < fawl: scoreA, scoreB = foul(scoreA, scoreB, foulAscore, 54 foulBscore) 55 第 60 页/共 79 页 56 57 58 59 60 61 62 63 64 65 66 67 68 69 else: if serving is 'A': if random() < probA: scoreA += 3 if probA3 > random() else 2 else: scoreB += 3 if probB3 > random() else 2 else: if random() < probB: scoreB += 3 if probB3 > random() else 2 else: scoreA += 3 if probA3 > random() else 2 print(scoreA,'--',scoreB) return Winner(scoreA, scoreB) 70 def gameOver(scoreA, scoreB): 71 72 73 74 75 76 77 78 79 80 81 82 def switchServing(serving): 83 84 85 86 87 88 89 def Winner(scoreA, scoreB): if serving is 'A': serving = 'B' global countdown; if countdown == 0: if scoreA == scoreB: countdown += 5 return False else: return True else: countdown -= 1 return False else: serving = 'A' return serving 第 61 页/共 79 页 90 91 return 'A' if scoreA > scoreB else 'B' 92 def simOneChampion(): 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 B = 0; A = 0; round = 1 argA, argB = getInputs(); serving = 'A' while True: print('第{}节'.format(round)) r = simOneGame(argA, argB,serving) serving = switchServing(serving) round += 1 if r is 'A': A += 1 else: B += 1 if A == 3: print('A队胜出') break elif B == 3: print('B队胜出') break else: continue 116 simOneChampion() [8.3]: 1 # 注意,这些是在终端里直接运行的代码! 2 # 以B站视频为例 3 # 常规下载 4 you-get /video/av3567324 5 # 仅查看视频信息 第 62 页/共 79 页 6 you-get -i /video/av3567324 7 # 将视频保存到特定位置,例如,windows下保存到E盘根目录 8 you-get -o E:/ /video/av3567324 9 10 # 注意! 11 # (1)各大视频网站需要登录观看的视频无法直接下载 12 # (2)有些网站视频需要设置代理 [8.4]: 1 import as ps 2 import jieba 3 import as plt 4 from import imread 5 from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator 6 7 txt = open('三国演义.txt','r',encoding = 'utf-8').read() 8 counts = {} 9 def wordAndFrequency(items): 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 def countFigures(): 第 63 页/共 79 页 total = 0 word_frequency = [] for i in range(20): word, count = items[i] a = [word, count] total += a[1] word_(a) for i in range(20): word_frequency[i][1] = word_frequency[i][1] / total word_frequency[i][1] = int(word_frequency[i][1] * 100) word_frequency[i][0].encode('utf-8') word_frequency[i] = tuple(word_frequency[i]) print(word_frequency[i]) return word_frequency 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 words = (txt) for w in words: if len() == 1: continue if == 'nr': rword = if rword == '玄德' or rword == '玄德曰': rword = '刘备' if rword == '孔明' or rword == '孔明曰': rword = '诸葛亮' if rword[-1:] == '兵': continue counts[rword] = (rword, 0) + 1 items = list(()) (key = lambda x:x[1], reverse = True) for i in range(20): word, count = items[i] print('{0:<10}{1:>5}'.format(word, count)) 43 44 45 return wordAndFrequency(items) 46 def generateWordCloud(word_frequency): 47 48 sanguo_color = imread('三国演义.jpg') wc = WordCloud(font_path='C:/Windows/Fonts/', background_color="black", #可以选择black或49 50 white 51 52 53 54 55 56 57 58 59 mask = sanguo_color, random_state=42, margin=5, width=1800, height=800) # 长宽度控制清 晰程度 te_from_frequencies(word_frequency) image_colors = ImageColorGenerator(sanguo_color) (r(color_func=image_colors)) ('off') () 第 64 页/共 79 页 60 61 () word_frequency = countFigures() 62 generateWordCloud(word_frequency) 第 65 页/共 79 页 第9章 科学计算和可视化 9.1 问题概述 [9.1]: 科学计算可以用于工程计算,如室内位置定位、动画解算、图形计算等。 [9.2]: 首先安装numpy+mkl,scipy,然后再安装matplotlib。 9.2 模块8:numpy库的使用 [9.3]: ((x,y), dtype) 创建元素类型为dtype的全1矩阵;((x,y), dtype) 创建 元素类型为dtype的全零矩阵;ce(x,y,n)常见一个由x到y,等分成n个元素的数组等 方法。 [9.4]: (ndarray)。 [9.5]: 对ndarray数组降维可使用flatten()函数,返回折叠后的一维数组,它的维数就降到 了一维。 9.3 实例17:图像的手绘效果 [9.6]: 三维。 [9.7]: 使用().convert('L ')方法可以将彩色图片转换成灰度图片。通过() 将它转换成ndarray矩阵,再通过索引处理每一个像素。 [9.8]: fromarray(ndarray)函数可以把ndarray类型转换成图像,前提是ndarray是个整型矩 阵。 9.4 模块9:matplotlib库的使用 [9.9]: 使用如下代码可以在屏幕上画出上下两个坐标系图: 1 t(211) 2 () 3 ... 4 t(212) 第 66 页/共 79 页 5 () 6 ... 7 () [9.10]: 坐标系标题、坐标轴、坐标轴对应的标签、单位名称、刻度值。 [9.11]: 设函数为f(x),则绘制曲线的精简代码可为:( [f(i) for i in range(1,10)])。 9.5 实例18:科学坐标图绘制 [9.12]: 代码18.1第13行的含义为:在点(1,cos2pi)处添加标注。 [9.13]: 代码18.1第32行图注中的内容在第13行被设定。 [9.14]: y曲线的颜色参数由第7行传入,在第8行color = pcolor设置,形状由linestyle= “-”设置。z曲线的颜色形状在第9行的第2个参数“b--”设置,b表示blue,--表示虚线。 9.6 实例19:多级雷达图绘制 [9.15]: 代码19.1第14行的含义为:将屏幕划分为1行1列,即不对屏幕划分,polar = True 表示绘制一个极坐标图。 [9.16]: 代码19.1第18行的含义为:绘制标题'DOTA能力值雷达图'于屏幕坐标系中,左下 角为(0,0),x = 0.52,y = 0.95表示标题位于中部靠上的位置。ha = 'center '表示文本居中。 [9.17]: 代码19.2第27行的含义为:设置标注,标注内容为data_labels内容,位置为(0.94, 0.8),文本行间距为0.1。 程序练习题 [9.1]:略。 [9.2]:略。 [9.3]: 1 from PIL import Image 2 import numpy as np 第 67 页/共 79 页 3 4 # 浮雕效果 5 # 自定义你的图像名称 6 7 vec_el = /8. 8 vec_az = /8. 9 10 depth = 10. 11 im = ('').convert('L') 12 a = y(im).astype('float') 13 grad = nt(a) 14 grad_x, grad_y = grad 15 grad_x = grad_x*depth/50 16 grad_y = grad_y*depth/50 17 dx = (vec_el)*(vec_az) 18 dy = (vec_el)*(vec_az) 19 dz = (vec_el) 20 21 A = (grad_x ** 2 + grad_y **2 + 1.) 22 uni_x = grad_x/A 23 uni_y = grad_y/A 24 uni_z = 1./A 25 a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) 26 a2 = (0,255) 27 28 im2 = ray(('uint8')) 29 ('pic_') [9.4]:略。 [9.5]: 1 import numpy as np 2 import as plt 3 import matplotlib 第 68 页/共 79 页 4 5 ms[''] = 'SimHei' 6 ms['-serif'] = ['SimHei'] 7 radar_labels = (['爆发力','技巧熟练度','气势', 8 '稳定性','速度']) 9 nAttr = 5 10 data = ([[0.8,0.9,0.9,0.75], 11 12 13 14 [0.85,0.87,0.9,0.9], [0.9,0.6,1.0,0.6], [0.8,0.7,0.7,0.9], [0.6,0.9,0.9,0.92]] 15 ) 16 data_labels = ('马龙','张继科','马琳', 17 '王励勤') 18 angles = ce(0, 2*, nAttr, endpoint = False) 19 data = enate((data, [data[0]])) 20 angles = enate((angles, [angles[0]])) 21 fig = (facecolor = 'white') 22 t(111, polar = True) 23 (angles, data, 'o-', linewidth = 1.5, alpha = 0.2) 24 (angles, data, alpha = 0.2) 25 rids(angles*180/, radar_labels, frac =1.2) 26 t(0.05, 0.97, '中国国家队乒乓球运动员参数雷达图',ha = 27 'left', size = 15) 28 legend = (data_labels, loc = (0.9,0.92), labelspacing 29 = 0.1) 30 #(_texts(), fontsize = 'small') 31 #(True) 32 g('holland_') 33 () 第 69 页/共 79 页 第10章 网络爬虫和自动化 10.1 问题概述 [10.1]: 可通过大量获取网页内容来为数据挖掘和机器学习提供训练数据。 10.2 模块10:requests库的使用 [10.2]: HTTP协议中get功能单纯的从服务器获取数据,服务器中网站数据不可能变化; post功能可以通过提交表单修改网站的数据(比如注册),网站数据可能变化。 [10.3]: 函数post(url链接,{key:value}) 这个字典中包含要提交的数据,比如username: Jim、Password:123456等。 [10.4]: 长度差异可能是编码造成的,text返回unicode,content返回str。在Python3.x环境 下长度相同。 10.3 模块11:beautifulsoup4库的使用 [10.5]: C。 [10.6]: 假设BeautifulSoup对象名称为soup, (1) print(); (2) print(); (3) ('p',{ 'id': 'China'}); (4) _all(string = e('[u4e00-u9fa5]')) 。 10.4 实例20:中国大学排名爬虫 [10.7]: 可以在输出格式上做进一步改进,按照特定字段排序输出,如根据培养规模排序输 出、根据高校名称排序输出等。 [10.8]: 将第26行改为u = allUniv[len(allUniv)-1-i],将第34行改为main(50),就可以输出 后50位大学。 [10.9]: 假设输出山东省的大学排名,将printUnivList(num)修改为: 第 70 页/共 79 页 23 def printUnivList(num): 24 25 26 27 28 29 30 print("{:^4}{:^10}{:^5}{:^8}{:^10}".format('排名','学校名称',' 省市','总分','培养规模')) for i in range(num): u = allUniv[i] if str(u[2]) == '山东省': print("{:^4}{:^10}{:^5}{:^8}{:^10}".format(u[0],u[1], u[2],u[3],u[6])) else: continue; 程序练习题 [10.1]: 1 import requests 2 from bs4 import BeautifulSoup 3 allUniv = [] 4 def getHTMLText(url): 5 6 7 8 9 10 11 12 try: r = (url, timeout = 30) _for_status() ng = 'utf-8' return except: return '' 13 def fillUnivList(soup): 14 15 16 data = _all('tr') for tr in data: ltd = _all('td') 第 71 页/共 79 页 17 18 19 20 21 22 if len(ltd) == 0: continue singleUniv = [] for td in ltd: () (singleUniv) 23 def printUnivList(num): 24 25 Univ = sorted(allUniv, key = lambda location: location[2]) print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".form 26 at(chr(12288),'排名','学校名称','省市','总分','培养规模')) 27 28 29 30 print("{1:^4}{2:{0}^10}{3:{0}^5}{4:{0}^8.1f}{5:{0}^10}".f for i in range(num): u = Univ[i] 31 ormat(chr(12288),u[0],u[1],u[2],eval(u[3]),u[6])) 32 33 def main(num): 34 35 l' 36 37 38 39 40 41 html = getHTMLText(url) soup = BeautifulSoup(html, '') fillUnivList(soup) print(len(allUniv)) printUnivList(len(allUniv)) url='/ 42 main(10) [10.2]: 1 import requests 2 from bs4 import BeautifulSoup 3 4 # USNEWS 的大学排名默认是卡片显示,为了处理方便,这里将它设置成表格显示 5 # USNEWS 的大学排名分页,在每一页的读取里加入了读取下一页网址的功能,就 6 是代码中的Button部分 第 72 页/共 79 页 7 # 回避其他因素,只进行了美国大学排名。 8 9 10 def getHtml(url): 11 response = (url) 12 _for_status() 13 ng = 'utf-8' 14 return 15 16 def parseHtml(): 17 url = 18 '/best- 19 colleges/rankings/national-universities?_sort=rank&_sort- 20 direction=asc&_mode=table' 21 while True: 22 text = getHtml(url) 23 soup = BeautifulSoup(text) 24 button = _all('a', {'class': 'button 25 secondary radius shadow full-width '}) 26 if len(button) == 0: 27 break 28 url = button[0]['href'] 29 university = _all('tr', {'data-parent- 30 id':'search-application-results-view'}) 31 rankUniversities(university) 32 33 def rankUniversities(universities): 34 for i in universities: 35 name = 36 rank = [1:4] 37 if rank == 'ank' or rank == 'nra': 38 rank = 'N/A' 39 if rank[-1] == 'i': 40 rank = rank[:-1] 第 73 页/共 79 页 41 enroll = [j for j in _all('td',{'class':'text- 42 right'})][1]. 43 print('{:<55}{:<5}{:<7}'.format(name, rank, 44 e('n','').replace(' ',''))) 45 46 parseHtml() [10.3]: 1 from bs4 import BeautifulSoup 2 import requests 3 4 def getHTML(url): 5 response = (url) 6 _for_status() 7 ng = 'utf-8' 8 return 9 10 def findLinks(text): 11 soup = BeautifulSoup(text) 12 title = _all('li', {'class':'base_name'})[0].string 13 time = _all('li',{'class':'base_pub'})[0].string 14 info = _all('li', {'class':'base_what'})[0].string 15 print('{}-{}{}'.format(title, time, info)) 16 series = _all('a',{'site':True}) 17 z = 0; 18 print('当前剧集:') 19 for i in series: 20 print('{:^3}'.format(),end = '') 21 z = z+1 22 if z%6 == 0: 23 print('n') 24 25 Text = 26 getHTML('/detail/show/XNjA4NTI=?spm=a2h0k.81 第 74 页/共 79 页 27 91414.0.0') 28 findLinks(text) [10.4]: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import requests def getRobotTXT(url): response = (url) _for_status() return def analyseTXT(url,text): try: file = open('','a') except: file = open('','w') s = ('User-agent:') for i in range(1,len(s)): sub = s[i].split('rn') string = '对于爬虫代理: {} ,以下网址不能访问: '.format(sub[0]) print(string) (string+'rn') for j in range(1,len(sub)): if sub[j][:9] == 'Disallow:': string = url+sub[j][10:] print(string) (string+'rn') () url = '' robots = '/' text = getRobotTXT(url+robots) analyseTXT(url, text) 第 75 页/共 79 页 [10.5]: 1 import requests 2 import bs4 3 import arser 4 5 def backhtml(url): 6 htmlback=(url) 7 htmlback_encoding=nt_encoding 8 soup=fulSoup(,'') 9 print('网页代码如下:') 10 print(fy()) 11 12 def robotana(url,urlwant,strin): 13 rp = ileParser() 14 _url(url) 15 () 16 if _fetch("*", urlwant) == True: 17 print('robots协议未禁止') 18 backhtml('' + urlwant) 19 else: 20 print("十分抱歉,对方网页禁止了您的访问;请看以下规则") 21 print(strin) 22 23 url=input("请输入您要爬取的网页,不用输'http':") 24 realurl=('/',1)[0] 25 roboturl=''+realurl+'/' 26 robotread=(roboturl) 27 ng=nt_encoding 28 if _code != 200: 29 print('您爬取的网站没有设置robots规则,正在返回网页源代码') 30 backhtml(''+url) 31 else: 32 print("正在分析规则..") 第 76 页/共 79 页 33 robotana(roboturl,url,) [10.6]: 1 import requests 2 import json 3 import re 4 import os 5 import random 6 7 folder_path = 'haha' 8 def getBaiduImage(url): 9 10 11 12 13 14 15 16 17 18 19 def tryPic(url): 20 21 22 23 24 25 26 def downLoadImage(data): 27 28 29 30 31 第 77 页/共 79 页 try: rsp = (url, timeout = 10) _for_status() except: print('对不起,百度图片访问失败!程序退出') return data = () downLoadImage(data) form = url[-4:] pat = '.*/(.*?)' + form pattern = e(pat, re.S) filename = l(pattern, url) return filename[0], form global folder_path (folder_path) imgs = data['data'] count = 0 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 for i in imgs: try: url = i['download_url'] img = (url, timeout = 10) img = t image,form = tryPic(url) FileName = folder_path +''+image+form file = open(FileName,'bw') (img) print('No.%d success' % count) except KeyError: print('No.%d failed'%count) count += 1 47 # 用女明星的图片进行测试 48 url = 49 '/channel/listjson?pn=0&rn=30&tag1=%E6%98 50 %8E%E6%98%9F&tag2=%E5%85%A8%E9%83%A8&ftags=%E5%A5%B3%E6%98%8E%E 51 6%98%9F##内地&ie=utf8'+'1'+'&rn=60&ie=utf8&oe=utf- 52 8&'+str(()) 53 getBaiduImage(url) [10.7]: 1 import requests 2 import time 3 def visitBaidu(): 4 5 6 7 8 9 10 url = '/' count = 0 fail = 0 start = () while True: if int(()-start) == 30: break 第 78 页/共 79 页 11 12 13 14 15 16 17 18 19 try: r = (url, timeout = 30) _for_status() count += 1 except: fail += 1 continue print('30秒内,访问百度{}次成功 {}次失败'.format(count, fail)) 20 visitBaidu() 第 79 页/共 79 页
版权声明:本文标题:Python语言程序设计基础(第2版)全答案v3-20180823 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1735817080a1691436.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论