《Python程序设计基础》第三版课后习题答案与重点代码解析
围绕《Python程序设计基础》第三版常见课后习题涉及的变量、条件判断、循环、列表字典、函数、文件处理等知识点,整理参考解题思路、完整代码与常见错误解析,帮助读者理解答案为什么这样写。
学习《Python程序设计基础》第三版时,课后习题真正需要解决的并不是“把答案抄下来”,而是看懂一道题如何从题目要求转换成变量、判断、循环、函数和数据结构。由于不同印次、出版社配套资源以及教学版本的习题编号可能存在差异,下面不虚构具体题号,而是按照教材基础阶段最常见的知识点整理代表性参考答案和完整代码。读者可以根据自己手中的题目,把题意对应到相应类型。
一、课后习题应该怎样看:先拆题,再写代码
很多基础题看起来各不相同,其实可以拆成几个固定问题:题目给了什么数据,要得到什么结果,中间是否需要判断,某个操作是否重复,以及代码是否应该封装成函数。把这几个问题弄清楚以后,代码通常不会很复杂。
例如题目要求“输入一个正整数 n,求 1 到 n 的和”,可以先写成三个步骤:
- 输入:一个正整数
n; - 处理:将 1、2、3……一直累加到
n; - 输出:累加后的结果。
这样就很容易判断,这是一道典型的循环累加题。
二、变量与基本输入输出:先处理好数据类型
基础章节的习题经常要求输入姓名、整数、浮点数,然后进行简单计算。这里最容易出现的问题,是忘记 input() 得到的结果默认是字符串。
示例:计算圆的面积
假设题目要求输入圆的半径,输出圆的面积,可以写成:
import math
radius = float(input("请输入圆的半径:"))
area = math.pi * radius ** 2
print(f"圆的面积为:{area:.2f}")
这里有三个值得注意的地方。float() 将输入转换为浮点数;** 2 表示平方;{area:.2f} 表示输出时保留两位小数。
假设输入:
示例输出为:
如果直接写:
radius = input("请输入圆的半径:")
area = 3.14 * radius * radius
就会出现类型问题,因为此时 radius 是字符串而不是数值。这类错误在前几章的习题中非常常见。
三、条件判断题:关键不是 if,而是条件有没有遗漏
条件判断题通常使用 if、elif 和 else。真正需要检查的是各个区间是否连续,有没有某些数值同时满足两个条件,或者一个条件都不满足。
示例:根据成绩输出等级
假设规则如下:
- 90~100:A;
- 80~89:B;
- 70~79:C;
- 60~69:D;
- 0~59:E。
完整参考代码:
score = float(input("请输入成绩:"))
if score < 0 or score > 100:
print("成绩输入有误")
elif score >= 90:
print("等级:A")
elif score >= 80:
print("等级:B")
elif score >= 70:
print("等级:C")
elif score >= 60:
print("等级:D")
else:
print("等级:E")
这里不必把每个判断都写成 80 <= score < 90。因为程序执行到第二个 elif 时,已经可以确定 score < 90,所以只检查是否大于等于 80 即可。
score >= 60 放在 score >= 90 前面,那么 95 分也会先满足“≥60”,后面的 A 等级判断就不会执行。这是条件题中非常典型的逻辑错误。
四、循环习题:掌握累加、计数和遍历三个基本模型
循环题的变化很多,但初学阶段最常见的本质只有三类:把一组数累加起来、统计满足条件的数据数量,以及逐个访问序列中的元素。
1. 求 1 到 n 的整数和
n = int(input("请输入正整数 n:"))
if n < 1:
print("n 必须是正整数")
else:
total = 0
for i in range(1, n + 1):
total += i
print("结果:", total)
range(1, n + 1) 中必须写成 n + 1,因为 Python 的 range() 不包含结束值。
当输入为 5 时,循环过程相当于:
total = 0
total = 0 + 1
total = 1 + 2
total = 3 + 3
total = 6 + 4
total = 10 + 5
最终结果是 15。
2. 统计 1~100 中能被 3 整除的数
count = 0
for number in range(1, 101):
if number % 3 == 0:
count += 1
print("数量:", count)
这里使用的是“计数器”模式。变量 count 并不保存这些数字本身,只记录满足条件的次数。
3. while 循环什么时候使用
如果循环次数已经确定,例如“执行 100 次”或者“遍历列表中的所有元素”,通常使用 for 更直接。若循环什么时候结束取决于运行过程,则 while 更自然。
例如不断输入数字,直到输入 0:
total = 0
while True:
number = float(input("请输入数字,输入 0 结束:"))
if number == 0:
break
total += number
print("总和:", total)
五、字符串、列表与字典题:先判断应该保存什么
进入组合数据类型后,很多习题的难点从“会不会写循环”变成“该选择哪一种数据结构”。简单来说,列表适合保存一组有顺序的数据,字典适合保存“键—值”对应关系。
示例一:列表去重并保持原顺序
假设原始数据为:
numbers = [3, 1, 3, 5, 1, 7, 5]
如果要求去掉重复数据,同时保持第一次出现的顺序,可以写:
numbers = [3, 1, 3, 5, 1, 7, 5]
result = []
for number in numbers:
if number not in result:
result.append(number)
print(result)
示例输出:
有些代码会直接写:
result = list(set(numbers))
这种写法确实能够删除重复值,但如果题目明确要求保持原始顺序,就不应该把“集合去重”当成唯一答案。做课后习题时,必须同时满足题目的数据要求和输出要求。
示例二:统计字符串中每个字符出现次数
text = input("请输入字符串:")
counter = {}
for char in text:
if char in counter:
counter[char] += 1
else:
counter[char] = 1
for char, count in counter.items():
print(char, count)
这里使用字典,是因为每一个字符都需要对应一个出现次数。例如输入:
得到的计数关系可以理解为:
a → 3
n → 2
还可以使用更简洁的写法:
text = input("请输入字符串:")
counter = {}
for char in text:
counter[char] = counter.get(char, 0) + 1
print(counter)
counter.get(char, 0) 表示:如果键已经存在就取得原来的值,不存在则使用默认值 0。
六、函数题:把一段完整功能封装起来
函数类习题经常要求“定义一个函数判断……”“编写函数计算……”。这类题不能只得到正确结果,还要按照题目要求正确使用参数和返回值。
示例:判断一个整数是不是素数
def is_prime(number):
if number < 2:
return False
for divisor in range(2, int(number ** 0.5) + 1):
if number % divisor == 0:
return False
return True
n = int(input("请输入整数:"))
if is_prime(n):
print(f"{n} 是素数")
else:
print(f"{n} 不是素数")
这段代码最需要理解的是两个地方。
一是小于 2 的整数不是素数,因此函数开始时直接排除。二是判断因数时,不需要一直检查到 number - 1,检查到平方根即可。假如一个合数存在大于平方根的因数,它必然还对应一个小于平方根的因数,因此前面已经能够发现。
对于刚开始学习函数的读者,更重要的是区分 return 和 print():
def add(a, b):
return a + b
return 将结果返回给调用位置,所以可以继续参与运算:
result = add(3, 5)
print(result * 2)
而下面的函数只是把结果显示出来:
def add(a, b):
print(a + b)
如果题目要求“函数返回计算结果”,就不能简单地用 print() 替代 return。
七、综合题:列表、函数与循环可以组合使用
教材后面的习题往往不再只考一个知识点,而是把多个基础结构组合起来。例如:给定一组成绩,要求输出平均分、最高分以及所有及格成绩。
可以先把功能拆开:
- 使用列表保存成绩;
- 通过函数计算平均值;
- 使用
max()获取最高分; - 通过循环和判断筛选及格成绩。
完整代码如下:
def calculate_average(scores):
if not scores:
return 0
return sum(scores) / len(scores)
scores = [78, 92, 56, 88, 64, 95]
average = calculate_average(scores)
highest = max(scores)
passed = []
for score in scores:
if score >= 60:
passed.append(score)
print(f"平均分:{average:.2f}")
print(f"最高分:{highest}")
print("及格成绩:", passed)
示例输出:
最高分:95
及格成绩: [78, 92, 88, 64, 95]
这道题值得注意的是 if not scores。如果成绩列表为空,直接进行 sum(scores) / len(scores) 会出现除以零的问题,因此函数先处理空列表这一边界情况。
八、文件操作题:注意打开模式、编码和关闭文件
文件处理习题通常要求读取文本、统计内容或者把结果写入文件。对于中文文本,建议明确指定 UTF-8 编码。
示例:统计文本文件的行数和字符数
假设当前 Python 程序所在目录有一个 data.txt 文件:
with open("data.txt", "r", encoding="utf-8") as file:
lines = file.readlines()
line_count = len(lines)
char_count = sum(len(line.rstrip("\n")) for line in lines)
print("行数:", line_count)
print("字符数:", char_count)
使用 with open(...) 的好处是代码块结束后文件会自动关闭,不需要手动调用 file.close()。
rstrip("\n") 用于去掉每一行末尾的换行符。如果题目要求“统计文件中的全部字符,包括换行符”,就不应该去掉它。
常见的文件模式
| 模式 | 作用 | 需要注意 |
|---|---|---|
r |
读取文件 | 文件不存在时会报错 |
w |
写入文件 | 原有内容会被覆盖 |
a |
追加内容 | 内容写到文件末尾 |
w 和 a。如果本来要求追加数据,却错误使用 w,原文件内容可能被覆盖。
九、代码题常见错误应该怎样检查
程序没有得到预期结果时,不要从第一行开始随机修改。基础阶段的问题通常集中在几个固定位置,可以按“语法—类型—范围—逻辑—边界”的顺序检查。
1. range() 少执行一次
例如:
for i in range(1, 10):
print(i)
实际输出的是 1~9,而不是 1~10。想包含 10 应写成:
for i in range(1, 11):
print(i)
2. input() 没有转换类型
下面的代码并不会得到 15:
a = input()
b = input()
print(a + b)
如果输入 10 和 5,得到的是字符串拼接结果 105。整数相加应写成:
a = int(input())
b = int(input())
print(a + b)
3. 把 = 和 == 混淆
= 用于赋值:
score = 90
== 用于比较:
if score == 90:
print("成绩等于 90")
4. 缩进位置错误
例如求 1~5 的累加结果时,输出通常应该放在循环外:
total = 0
for i in range(1, 6):
total += i
print(total)
如果把 print(total) 缩进到循环内部,就会连续输出五次中间结果。这不一定是语法错误,但与题目要求可能不一致。
十、如何验证自己的课后习题答案
代码能够运行,并不等于答案一定正确。最可靠的方法,是准备几组能够覆盖不同情况的测试数据。
以“判断成绩等级”为例,至少应该测试:
- 普通值:例如 85;
- 边界值:60、70、80、90、100;
- 最低合法值:0;
- 非法值:-1、101。
如果这些数据都符合题目规定,才比较有把握说明条件逻辑没有遗漏。
十一、重点知识点之间是什么关系
如果把课后习题逐题孤立地看,会觉得需要记住很多不同写法。实际上,这些题目之间有很清晰的递进关系。
变量和表达式解决的是“数据怎样表示、怎样计算”;条件结构解决“什么情况下做什么”;循环解决“同一类处理怎样重复执行”;列表和字典负责保存更多数据;函数把重复或独立的处理过程封装起来;文件操作则把数据从程序内存扩展到外部文件。
理解这种关系后,遇到综合题就可以反过来拆分。例如“读取学生成绩文件,统计及格人数并计算平均分”实际上包含:
- 文件读取;
- 字符串转数字;
- 循环遍历;
- 条件判断;
- 计数和累加。
把大题拆成这些已经练习过的小结构,比尝试一次写出完整程序更容易。
十二、课后习题答案应该怎样使用
参考答案最适合用在两个阶段。一个阶段是自己已经写过程序,但结果不正确,可以把自己的代码和参考实现逐段比较;另一个阶段是已经得到正确结果,希望看看还有没有更清晰的写法。
不建议一开始就逐行照抄。因为基础题往往只需要十几行代码,照抄以后虽然很快得到运行结果,却容易遗漏最重要的判断过程。例如同样是求和题,真正需要掌握的是:
- 累加变量为什么初始化为 0;
- 循环为什么从 1 开始;
range()的结束值为什么要加 1;total += i每执行一次变量发生什么变化。
如果能够在不看代码的情况下回答这些问题,说明这道题的核心知识已经掌握。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









