菜鸟教程Python 100例在Python 3环境下的代码修正指南
针对菜鸟教程经典的Python 100例在Python 3环境下运行时常见的语法与内置函数报错,提供系统化的代码修改方案、对比分析与排错步骤。
菜鸟教程经典“Python 100例”是许多初学者练习编程逻辑的入门题库,但其中早期整理的部分题目代码源自 Python 2 语法规范。初学者直接复制到 Python 3 解释器中运行时,常会遭遇 SyntaxError 或 NameError。本文直接归纳核心报错根源,系统列出高频修改规则、典型例题代码对照以及环境迁移排错流程,帮助读者顺利在 Python 3 环境下完成全部百例练习。
一、高频报错特征与迁移排查流程
Python 2 到 Python 3 并非简单的增量更新,而是对部分基础语法、I/O 机制以及内置容器迭代方式做了破坏向后兼容的清理。在 100 例练习中,绝大多数执行失败都集中在控制台打印、用户输入、整型除法和生成器范围 4 个关键语法点上。
遇到实例运行报错时,应首先通过解释器抛出的异常类型准确定位差异源头,随后按照固定范式做微调,整体排错流程如下图所示:
二、四大核心语法的关键差异与修改规则
只要掌握以下四项语法转换,菜鸟教程中 90% 以上无法直接运行的百例题目即可恢复正常执行。
1. print 语句转为 print() 函数
在 Python 2 中,print 属于关键字语句,后面直接跟空格与表达式;末尾加逗号表示不换行。在 Python 3 中,print() 成为内置函数,所有打印参数必须用圆括号包裹,不换行则通过 end 命名参数指定。
- 常规换行输出:
print "Hello"必须修改为print("Hello")。 - 行末不换行:
print x,必须修改为print(x, end=' ')或print(x, end='')。若原题用于打印九九乘法表或几何图案,保留end=' '可防止输出被打散成多行。
2. 输入函数 raw_input() 与 input() 的统一
在 Python 2 中,raw_input() 读取控制台原始文本输入并返回 str;而 input() 则会对输入字符串执行 eval() 求值。Python 3 彻底移除了 raw_input(),并将 input() 调整为始终返回字符串类型。
- 获取文本: 原
name = raw_input("请输入:")直接替换为name = input("请输入:")。 - 获取数字并计算: 原代码若写
num = input()期待得到整数,在 Python 3 中必须显式添加类型转换:num = int(input("请输入数字:"))。
3. 循环迭代 xrange() 与 range()
在 Python 2 中,range() 会在内存中立即生成完整的列表,而 xrange() 返回惰性生成器以节省内存。百例中有大量遍历数字范围的习题使用了 xrange()。Python 3 删除了 xrange(),并让内置的 range() 本身就具备惰性求值特性。
- 修改方式: 全文直接查找并将
xrange(...)替换为range(...)。
4. 真除法与整除运算符
在 Python 2 中,两个整数使用 / 相除会截断小数取整(例如 5 / 2 == 2)。在 Python 3 中,单个斜杠 / 统一为真除法,5 / 2 将返回浮点数 2.5。如果算法依赖原有的向零取整逻辑(例如回文数判断、数位拆分、坐标换算),必须显式改用双斜杠 // 整除运算符。
三、易混淆认知辨析:直接加括号是否就够了?
许多初学者存在一种常见误解:“Python 3 与 Python 2 最大的差别就是 print,遇到报错只要在 print 后面套上一对括号就能解决所有问题。”
这种说法之所以流行,是因为 print "..." 造成的 SyntaxError: Missing parentheses in call to 'print' 往往出现在代码的第一行或第二行,修复后程序立刻可以往下走。但这种观点并不完整,在菜鸟教程百例的以下场景中容易导致隐蔽的运行错误:
- 多项打印的元组陷阱: 在 Python 2 中,
print a, b输出两个用空格隔开的值。若机械地改成print (a, b),在 Python 2 下会被解析为打印一个元组并带括号(a, b);在 Python 3 中虽然print(a, b)合法,但如果多加了括号层级如print((a, b)),输出格式就会失真,导致判题或对比失效。 - 字典与迭代器遍历: Python 2 教程源码常见
dict.has_key('k')、dict.iteritems()。在 Python 3 中,has_key已被彻底废除,必须写成'k' in dict;iteritems()需改写为dict.items()。 - 排序函数 cmp 参数废弃: 百例中部分高级排序练习题使用了
list.sort(cmp=...)或sorted(iterable, cmp=...)。Python 3 中cmp参数完全移除,必须改用key参数配合lambda或functools.cmp_to_key。
四、典型题目的修正代码对比实例
下面挑选菜鸟教程百例中几道极具代表性的例题,给出原版代码与 Python 3 规范写法对照。
例题 1:九九乘法表(考察 print 不换行与格式化)
原版代码使用末尾逗号控制不换行,且外层使用了 xrange:
# Python 2 原版写法(在 Python 3 中报错)
for i in xrange(1, 10):
for j in xrange(1, i + 1):
print "%d*%d=%-3d" % (i, j, i * j),
print ''
在 Python 3 环境下修正为:
# Python 3 修正写法
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{i}*{j}={i * j:<3}", end=' ')
print()
修正说明:xrange 变更为 range;print 添加括号并通过 end=' ' 保留每行项之间的空格;字符串格式化改用更直观的 f-string(或保持 "%d*%d=%-3d" % (i, j, i * j))。
例题 2:回文数判断(考察整除与输入类型)
原版代码直接使用 raw_input 获取输入并对整数做数位提取:
# Python 2 原版写法
a = int(raw_input("请输入一个5位数:\n"))
x = a / 10000
y = a % 10
if x == y:
print "这是个回文数"
else:
print "这不是回文数"
在 Python 3 环境下修正为:
# Python 3 修正写法
a = int(input("请输入一个5位数:\n"))
x = a // 10000 # 注意:必须使用 // 整除,否则 x 会变成浮点数
y = a % 10
if x == y:
print("这是个回文数")
else:
print("这不是回文数")
修正说明:raw_input 改为 input;计算万位数值时必须使用 //,若写成 a / 10000,在 Python 3 中 x 会是浮点类型(例如 12321 / 10000 得到 1.2321),后续条件判断将彻底出错。
五、批量处理建议与常见注意事项
在系统刷完百例题目的过程中,读者可以根据自身情况选择适宜的排查策略:
- 逐题手工修正(推荐入门者): 每次遇到报错时,查阅本文图 1 流程,手动将
print补齐括号、将raw_input改为input。这种肌肉记忆能加深对 Python 基础语法的理解。 - 使用官方 2to3 工具自动化扫描: Python 安装包通常自带
2to3命令行工具(例如运行2to3 -w example.py)。该工具能够自动把print语句、xrange、以及字典方法转换为 Python 3 语法。需要注意的是,2to3无法替你判断哪些/需要改成//,仍需人工复查整除逻辑。 - 保留良好编码习惯: 在 Python 3 环境下书写百例代码时,优先采用 f-string(如
f"结果为: {res}")进行字符串插值,不仅书写更简洁,也能规避原教程中常见的%格式化参数不匹配问题。
TypeError: can only concatenate str (not "int") to str,说明原代码中存在 print "Result: " + count 这类利用弱类型隐式拼接的假想。在 Python 3 中必须使用逗号传参 print("Result:", count) 或显式强转 str(count)。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













