欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python程序设计与算法基础教程(第二版)》 姜红 余青松 全章课后习题、上机练习、课后答案、案例分析

最编程 2024-05-09 08:25:37
...

(还在更新中…) 这篇博客花费了我的大量时间和精力,从创作到维护;若认可本篇博客,希望给一个点赞、收藏

并且,遇到了什么问题,请在评论区留言,我会及时回复的


这本书对Python的知识点的描述很详细,而且排版看的很舒服

  1. 几个例题: 假装自己从零开始学,将一些有代表性、有意思的例题抽取出来
  2. 部分复习题: 遇到有意思的复习题,我会拿出来,并且进行分析
  3. 上机实践: 全部上机实践题的解题思路

文章目录

  • 第一章 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)

  1. Python 3.7 Module Docs(64-bit)
    点击之后,会出现一个网页(将我下载的Python3.7.4文件夹中包含的模块都列了出来,页面不止这么点,还可以往下拉)

  2. IDLE(Python 3.7 64-bit)
    一个Python编辑器,Python内置的集成开发工具

  3. Python 3.7 Manuals(64-bit)
    Python 3.7 开发手册

  4. Python 3.7(64-bit)
    控制台中运行Python

二:更新pip和setuptools包,安装NumPy包,安装Matplotlib包

以下三个命令都是在控制台(windows中的cmd)中运行

更新pip和setuptools包

  1. pip用于安装和管理Python扩展包
  2. 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文件的两种方式:

  1. 右键test.py---->Edit With IDLE---->Edit With IDLE 3.7(64-bit)
  2. 打开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()
  1. 在桌面打开PowerShell(还有两种输入方式:python hello.py或者.\hello.py
  2. 或者在桌面打开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])
  1. 在桌面打开PowerShell(还有两种输入方式:python hello_argv.py 任意输入或者./hello_argv.py 任意输入
  2. 或者在桌面打开cmd,就输入hello_argv.py 任意输入或者python hello_argv.py 任意输入

补充:以图中第一个命令举例,hello_argv.pysys.argv[0]Pythonsys.argv[1]

第二章 Python语言基础


选择题:1、3、7、8

1. 在Python中,以下标识符合法的是

A. _ B. 3C C. it’s B. str

答案:A

  1. 标识符的第一个字符必须是字母,下划线(_);其后的字符可以是字母、下划线或数字。
  2. 一些特殊的名称,作为python语言的保留关键字,不能作为标识符
  3. 以双下划线开始和结束的名称通常具有特殊的含义。例如__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

  1. 分号;用于在一行书写多个语句
  2. 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中的自动类型转换:

  1. 自动类型转换注意针对Number数据类型来说的
  2. 当2个不同类型的数据进行运算的时候,默认向更高精度转换
  3. 数据类型精度从低到高:bool int float complex
  4. 关于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之和

  1. 使用for循环(递增):
total = 0
for i in range(101):
    total += i
print(total) 
  1. 使用求和公式:
>>> (1 + 100) 
						

上一篇: 使用 ffmpeg 对视频进行转码(支持浏览器播放)

下一篇: VUE 事件处理 @click 使用示例代码