Python程序设计与算法基础教程(第二版)》 姜红 余青松 全章课后习题、上机练习、课后答案、案例分析
(还在更新中…) 这篇博客花费了我的大量时间和精力,从创作到维护;若认可本篇博客,希望给一个点赞、收藏
并且,遇到了什么问题,请在评论区留言,我会及时回复的
这本书对Python的知识点的描述很详细,而且排版看的很舒服
- 几个例题: 假装自己从零开始学,将一些有代表性、有意思的例题抽取出来
- 部分复习题: 遇到有意思的复习题,我会拿出来,并且进行分析
- 上机实践: 全部上机实践题的解题思路
文章目录
- 第一章 Python概述
- 几个例题
- 第二章 Python语言基础
- 选择题:1、3、7、8
- 思考题:9
- 上机实践:2~6
- 案例研究:使用Pillow库处理图像文件
- 第三章 程序流程控制
- 几个例题
- 选择题:1、2、3
- 填空题:6
- 思考题:3~6
- 上机实践:2~14
- 案例研究:使用嵌套循环实现图像处理算法
- 第四章 常用内置数据类型
- 几个例题
- 选择题:11
- 填空题:4、7、8、9、10、13、21
- 思考题:5
- 上机实践:2~14
- 案例研究:科学计算和数据分析
- 第五章 序列数据类型
- 几个例题
- 选择题:4、5、7、11、12
- 填空题:1、5、6、12、13、14
- 思考题:2、3、5
- 上机实践:2~6
- 案例研究:猜单词游戏
- 第六章 输入和输出
- 几个例题
- 填空题:1、2
- 例题及上机实践:2~5
- 案例研究:21点扑克牌游戏
- 第七章 错误和异常处理
- 几个例题
- 案例研究:使用调试器调试Python程序
- 第八章 函数和函数式编程
- 一些知识点总结和几个例题
- 选择题:1~5
- 思考题:4~11
- 上机实践:2~5
- 案例研究:井字棋游戏
- 第九章 面向对象的程序设计
- 第十章 模块和客户端
- 第十一章 算法与数据结构基础
- 第十二章 图形用户界面
- 案例研究:简易图形用户界面计算器
- 第十三章 图形绘制
- 图形绘制模块:tkinter
- 图形绘制模块:turtle
- 第十四章 数值日期和时间处理
- 第十五章 字符串和文本处理
- 第十六章 文件和数据交换
- 第十七章 数据访问
- 第十八章 网络编程和通信
- 第十九章 并行计算:进程、线程和协程
- 第二十章 系统管理
第一章 Python概述
几个例题
一:Python3.7.4下载
python3.7.4下载地址:https://www.python.org/downloads/release/python-374/
页面最下面:
下载,安装完python后:出现的四个玩意:Python 3.7 Module Docs,IDLE,Python 3.7 Manuals,Python 3.7(64-bit)
-
Python 3.7 Module Docs(64-bit)
点击之后,会出现一个网页(将我下载的Python3.7.4文件夹中包含的模块都列了出来,页面不止这么点,还可以往下拉) -
IDLE(Python 3.7 64-bit)
一个Python编辑器,Python内置的集成开发工具 -
Python 3.7 Manuals(64-bit)
Python 3.7 开发手册 -
Python 3.7(64-bit)
控制台中运行Python
二:更新pip和setuptools包,安装NumPy包,安装Matplotlib包
以下三个命令都是在控制台(windows中的cmd)中运行
更新pip和setuptools包
- pip用于安装和管理Python扩展包
- setuptools用于发布Python包
python -m pip install -U pip setuptools
安装NumPy
Python扩展模块NumPy提供了数组和矩阵处理,以及傅立叶变换等高效的数值处理功能
python -m pip install NumPy
安装Matplotlib包
Matplotlib是Python最著名的绘图库之一,提供了一整套和MATLAB相似的命令API,既适合交互式地进行制图,也可以作为绘图控件方便地嵌入到GUI应用程序中
python -m pip install Matplotlib
三:使用IDLE打开和执行Python源文件程序
首先:
有一个.py文件test.py
使用IDLE打开.py文件的两种方式:
- 右键test.py---->Edit With IDLE---->Edit With IDLE 3.7(64-bit)
- 打开IDLE,然后File---->Open(或者
ctrl+O
)选择.py文件
运行
Run---->Run Module(或者F5
)
就会出现这个界面,执行结果显示在这个界面中
补充一点:
如果在IDLE中编辑.py文件,记得修改后要保存(ctrl+s
),再运行(F5
)
四:使用资源管理器运行hello.py
hello.py文件在桌面
import random
print("hello,Python")
print("你今天的随机数字是:",random.choice(range(10)))#输出在0-9之间随机选择的整数
input()
- 在桌面打开PowerShell(还有两种输入方式:
python hello.py
或者.\hello.py
)
- 或者在桌面打开cmd, 就输入
hello.py
或者python hello.py
补充:上述两种命令中的hello.py
都是相对路径,因为文件在桌面,而且我是在桌面打开cmd,所以文件路劲可以这么简简单单的写。如果文件存储位置和cmd打开位置不一样,请使用绝对路径
五:命令行参数示例hello_argv.py
hello_argv.py文件在桌面
import sys
print("Hello,",sys.argv[1])
#这样写也行:
#print("Hello,"+sys.argv[1])
- 在桌面打开PowerShell(还有两种输入方式:
python hello_argv.py 任意输入
或者./hello_argv.py 任意输入
)
- 或者在桌面打开cmd,就输入
hello_argv.py 任意输入
或者python hello_argv.py 任意输入
补充:以图中第一个命令举例,hello_argv.py
即sys.argv[0]
;Python
即sys.argv[1]
第二章 Python语言基础
选择题:1、3、7、8
1. 在Python中,以下标识符合法的是
A. _ | B. 3C | C. it’s | B. str |
---|
答案:A
- 标识符的第一个字符必须是字母,下划线(_);其后的字符可以是字母、下划线或数字。
- 一些特殊的名称,作为python语言的保留关键字,不能作为标识符
- 以双下划线开始和结束的名称通常具有特殊的含义。例如
__init__
为类的构造函数,一般应避免使用
B:以数字开头,错误
C:使用了'
,不是字母、下划线或数字
D:str是保留关键字
3. 在下列Python语句中非法的是
A. x = y =1 | B. x = (y =1) | C. x,y = y,x | B. x=1;y=1 |
---|
答案:B,C
7. 为了给整型变量x,y,z赋初值10,下面Python赋值语句正确的是
A. xyz=10 | B. x=10 y=10 z=10 | C. x=y=z=10 | B. x=10,y=10,z=10 |
---|
答案:C
- 分号
;
用于在一行书写多个语句- python支持链式赋值
A:赋值对象是xyz
B:分号;
用于在一行书写多个语句,而不是' '
(即空格)
D:分号;
用于在一行书写多个语句,而不是,
8. 为了给整型变量x,y,z赋初值5,下面Python赋值语句正确的是
A. x=5;y=5;z=5 | B. xyz=5 | C. x,y,z=10 | B. x=10,y=10,z=10 |
---|
答案:A
Pytho能支持序列解包赋值,但是变量的个数必须与序列的元素个数一致,否则会报错
B:赋值对象是xyz
C:序列解包赋值,变量的个数必须与序列的元素个数一致,否则会报错
D:分号;
用于在一行书写多个语句,而不是,
思考题:9
9.下列Python语句的输出结果是
def f():pass
print(type(f()))
结果:<class 'NoneType'>
NoneType数据类型包含唯一值None,主要用于表示空值,如没有返回值的函数的结果
上机实践:2~6
2. 编写程序,输入本金、年利率和年数,计算复利(结果保留两位小数)
money = int(input("请输入本金:"))
rate = float(input("请输入年利率:"))
years = int(input("请输入年数:"))
amount = money*((1+rate/100)**years)
print(str.format("本金利率和为:{0:2.2f}",amount))
运行:
请输入本金:1000
请输入年利率:6.6
请输入年数:10
本金利率和为:1894.84
3. 编写程序,输入球的半径,计算球的表面积和体积(结果保留两位小数)
import math
r = float(input("请输入球的半径:"))
area = 4 * math.pi * r**2
volume = 4/3*math.pi*r**3
print(str.format("球的表面积为:{0:2.2f},体积为:{1:2.2f}",area,volume))
运行:
请输入球的半径:666
球的表面积为:5573889.08,体积为:1237403376.70
4. 编写程序,声明函数getValue(b,r,n),根据本金b,年利率r和年数n计算最终收益v
money = int(input("请输入本金:"))
rate = float(input("请输入年利率(<1):"))
years = int(input("请输入年数:"))
def getValue(b,r,n):
return b*(1+r)**n
print(str.format("本金利率和为:{0:2.2f}",getValue(money,rate,years)))
运行:
请输入本金:10000
请输入年利率(<1):0.6
请输入年数:6
本金利率和为:167772.16
5. 编写程序,求解一元二次方程x2-10x+16=0
from math import sqrt
x = (10+sqrt(10*10-4*16))/2
y = (10-sqrt(10*10-4*16))/2
print(str.format("x*x-10*x+16=0的解为:{0:2.2f},{1:2.2f}",x,y))
运行:
x*x-10*x+16=0的解为:8.00,2.00
6. 编写程序,提示输入姓名和出生年份,输出姓名和年龄
import datetime
sName = str(input("请输入您的姓名:"))
birthday = int(input("请输入您的出生年份:"))
age = datetime.date.today().year - birthday
print("您好!{0}。您{1}岁。".format(sName,age))
运行:
请输入您的姓名:zgh
请输入您的出生年份:1999
您好!zgh。您20岁。
案例研究:使用Pillow库处理图像文件
https://blog.****.net/Zhangguohao666/article/details/102060722
通过此案例,进一步了解Python的基本概念:模块、对象、方法和函数的使用
第三章 程序流程控制
几个例题
一:编程判断某一年是否为闰年
闰年:年份能被4整除但不能被100整除,或者可以被400整除。
口诀:四年一闰,百年不闰,四百必闰
代码一:
y = int(input("请输入要判断的年份:"))
if((y % 4 == 0 and y % 100 != 0) or y % 400 == 0):
print("是闰年")
else:
print("不是闰年")
代码二(使用calendar模块的isleap()函数来判断):
from calendar import isleap
y = int(input("请输入要判断的年份:"))
if(isleap(y)):print("闰年")
else:print("不是闰年")
二:利用嵌套循环打印九九乘法表
九九乘法表:
for i in range(1,10):
s = ""
for j in range(1,10):
s += str.format("%d * %d = %02d " %(i, j, i*j))
print(s)
下三角:
for i in range(1,10):
s = ""
for j in range(1,i+1):
s += str.format("%d * %d = %02d " %(i, j, i*j))
print(s)
上三角:
for i in range(1,10):
s = ""
for k in range(1,i):
s += " "
for j in range(i,10):
s += str.format("%d * %d = %02d " %(i, j, i*j))
print(s)
三:enumerate()函数和下标元素循环示例
Python语言中的for循环直接迭代对象集合中的元素,如果需要在循环中使用索引下标访问集合元素,则可以使用内置的enumerate()函数
enumerate()函数用于将一个可遍历的数据对象(例如列表、元组或字符串)组合为一个索引序列,并返回一个可迭代对象,故在for循环当中可直接迭代下标和元素
seasons = ["Spring","Summer","Autumn","Winter"]
for i,s in enumerate(seasons,start=1): #start默认从0开始
print("第{0}个季节:{1}".format(i,s))
运行:
第1个季节:Spring
第2个季节:Summer
第3个季节:Autumn
第4个季节:Winter
四:zip()函数和并行循环示例
如果需要并行遍历多个可迭代对象,则可以使用Python的内置函数zip()
zip()函数将多个可迭代对象中对应的元素打包成一个个元组,然后返回一个可迭代对象。如果元素的个数不一致,则返回列表的长度与最短的对象相同。
利用运算符*
还可以实现将元组解压为列表
evens = [0,2,4,6,8]
odds = [1,3,5,7,9]
for e,o in zip(evens,odds):
print("{0} * {1} = {2}".format(e,o,e*o))
运行:
0 * 1 = 0
2 * 3 = 6
4 * 5 = 20
6 * 7 = 42
8 * 9 = 72
五:map()函数和循环示例
如果需要遍历可迭代对象,并使用指定函数处理对应的元素,则可以使用Python的内置函数map()
map(func,seq1[,seq2,...])
- func作用于seq中的每一个元素,并将所有的调用结果作为可迭代对象返回。
- 如果func为None,该函数的作用等同于zip()函数
计算绝对值:
>>> list(map(abs, [-1, 0, 7, -8]))
[1, 0, 7, 8]
计算乘幂:
>>> list(map(pow, range(5), range(5)))
[1, 1, 4, 27, 256]
计算ASCII码:
>>> list(map(ord, 'zgh'))
[122, 103, 104]
字符串拼接(使用了匿名函数lambda):
>>> list(map(lambda x, y: x+y, 'zgh', '666'))
['z6', 'g6', 'h6']
选择题:1、2、3
1. 下面的Python循环体的执行次数与其他不同的是
A.
i = 0
while(i <= 10):
print(i)
i = i + 1
B.
i = 10
while(i > 0):
print(i)
i = i - 1
C.
for i in range(10):
print(i)
D.
for i in range(10,0,-1):
print(i)
答案:A
A:[0,10] 执行11次
B:[10,1] 执行10次
C:[0,9) 执行10次
D:[10,0) 执行10次
2. 执行下列Python语句将产生的结果是
x = 2; y = 2.0
if(x == y): print("Equal")
else: print("Not Equal")
A. Equal | B. Not Equal | C. 编译错误 | D. 运行时错误 |
---|
答案:A
Python中的自动类型转换:
- 自动类型转换注意针对Number数据类型来说的
- 当2个不同类型的数据进行运算的时候,默认向更高精度转换
- 数据类型精度从低到高:bool int float complex
- 关于bool类型的两个值:True 转化成整型是1;False 转化成整型是0
int类型的2转化为float类型的2.0
3. 执行下列Python语句将产生的结果是
i= 1
if(i): print(True)
else: print(False)
A. 输出1 | B. 输出True | C. 输出False | D. 编译错误 |
---|
答案:B
在Python中,条件表达式最后被评价为bool值True或False。
如果表达式的结果为数值类型(0
),空字符串(""
),空元组(()
),空列表([]
),空字典({}
),其bool值为False
,否则其bool值为True
填空题:6
6. 要使语句for i in range(_,-4,-2)循环执行15次,则循环变量i的初值应当为
答案:26或者25
一开始我给的答案是26,经过评论区 亻的提醒:
>>> a = 0
>>> for i in range(26, -4, -2): a+=1
>>> print(a)
15
>>> a = 0
>>> for i in range(25, -4, -2): a+=1
>>> print(a)
15
这种题目有一个规律:for i in range(x,y,z):
若循环中没有break或者continue语句,
执行次数的绝对值:result = (x-y)÷z
但实际上没有这么简单:
- 如果步长为 -1或者1,那么答案只有一个
- 如果步长为 -2或者2,那么答案有两个
- 如果步长为 -3或者3,那么答案有三个
- …
通过公式算出 x 之后,
- 如果步长为2,还要计算 (x ± 1) - z × (result-1) 的值,然后再经过琐碎的判断即可
- 如果步长为3,还要计算 (x ± 2) - z × (result-1) 的值,…
- …
虽然看着麻烦,但实际上是很好理解的
思考题:3~6
3. 阅读下面的Python程序,请问程序的功能是什么?
from math import sqrt
n = 0
for m in range(101,201,2):
k = int(sqrt(m))
for i in range(2, k+2):
if m % i == 0:break
if i == k + 1:
if n % 10 == 0:print()
print('%d' % m,end = " ")
n += 1
输出101到200之间的素数
每行输出10个,多余换行
运行:
101 103 107 109 113 127 131 137 139 149
151 157 163 167 173 179 181 191 193 197
199
素数(质数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
4. 阅读下面的Python程序,请问输出的结果使什么?
n = int(input("请输入图形的行数:"))
for i in range(0, n):
for j in range(0, 10 - i):print(" ", end=" ")
for k in range(0, 2 * i + 1):print(" * ", end=" ")
print("\n")
输出的是一个金字塔
运行:
请输入图形的行数:4
*
* * *
* * * * *
* * * * * * *
5. 阅读下面的Python程序,请问输出的结果使什么?程序的功能是什么?
for i in range(100,1000):
n1 = i // 100
n2 = i // 10 % 10
n3 = i % 10
if(pow(n1, 3) + pow(n2, 3) + pow(n3, 3) == i):print(i, end=" ")
输出三位数中所有的水仙花数
运行:
153 370 371 407
水仙花数 是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
6. 阅读下面的Python程序,请问输出的结果使什么?程序的功能是什么?
for n in range(1,1001):
total = 0; factors = []
for i in range(1, n):
if(n % i == 0):
factors.append(i)
total += i
if(total == n):print("{0} : {1}".format(n, factors))
输出1到1000的所有完数,并输出每个完数的所有因子
运行:
6 : [1, 2, 3]
28 : [1, 2, 4, 7, 14]
496 : [1, 2, 4, 8, 16, 31, 62, 124, 248]
完数 所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身
上机实践:2~14
2. 编写程序,计算1=2+3+…+100之和
- 使用for循环(递增):
total = 0
for i in range(101):
total += i
print(total)
- 使用求和公式:
>>> (1 + 100)