Python 2.x与3.x主要差异包括:1. print变为函数;2. 字符串默认为Unicode,bytes显式表示字节串;3. /返回浮点除,//为整除;4. input()统一为读取字符串;5. 异常捕获用as语法;6. range、map等返回迭代器;7. 标准库模块重命名;8. 移除旧语法。推荐使用Python 3。

Python 2.x 和 Python 3.x 是两个主要版本系列,虽然语法相似,但在设计和实现上有多个关键区别。以下是它们之间最常见且重要的差异:
1. print 语句与函数
在 Python 2.x 中,print 是一个语句,不需要括号(尽管加括号有时也能运行):
print "Hello, World!"而在 Python 3.x 中,print 变成了一个函数,必须使用括号:
print("Hello, World!")这种变化让输出操作更一致,也支持更多参数控制。
立即学习“Python免费学习笔记(深入)”;
2. Unicode 字符串处理
Python 2 默认使用 ASCII 编码,字符串分为 str(字节串) 和 unicode(Unicode 字符串) 两种类型:
s = 'hello' # 字节串u = u'hello' # Unicode 字符串
Python 3 中,所有字符串默认就是 Unicode(即 Python 2 中的 unicode 类型),str 表示文本(Unicode),而字节串用 bytes 显式表示:
s = 'hello' # Unicode 文本b = b'hello' # 字节串
这减少了编码混乱,尤其是在处理中文或国际化内容时更加清晰。
3. 整数除法行为不同
Python 2 中,两个整数相除会执行“地板除”(向下取整),除非至少有一个浮点数:
3 / 2 # 结果是 1(整除)3 // 2 # 也是 1
Python 3 中,/ 始终返回浮点数结果,// 才是整除:
3 / 2 # 结果是 1.53 // 2 # 结果是 1
这一改变更符合数学直觉,减少初学者误解。
4. input() 和 raw_input() 的变化
Python 2 有两个函数:
本文适合有经验的程序员尽快进入Python2.x世界.特别地,如果你掌握Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的Python程序。
- raw_input():读取用户输入并返回字符串
- input():读取输入并尝试执行为 Python 表达式(有安全风险)
Python 3 移除了 input() 的旧行为,只保留了相当于 Python 2 中 raw_input() 的功能,并将其命名为 input()。原来的 input() 被移除。
5. 异常语法
Python 2 支持两种写法:
raise Exception, "message" # 老式语法raise Exception("message") # 新式语法
Python 3 只允许括号形式:
raise Exception("message")同时,捕获异常的语法也统一为:
try:...
except ValueError as e:
print(e)
不再支持逗号分隔的写法(except ValueError, e)。
6. 迭代器返回类型不同
一些内置函数如 range()、map()、filter() 在 Python 3 返回的是迭代器而不是列表:
# Python 3range(5) # 返回 range 对象(惰性计算)
list(range(5)) # 才得到 [0, 1, 2, 3, 4]
Python 2 中 range() 直接返回列表,xrange() 才是迭代器。Python 3 移除了 xrange(),range() 就是原来的 xrange。
7. 库模块的重组与重命名
Python 3 对标准库进行了一些结构调整,部分模块被重命名或合并。例如:
- urllib2 被整合进 urllib 模块(分为 urllib.request, urllib.parse 等)
- ConfigParser 改名为 configparser(小写)
- Queue 变为 queue
这些变化使得命名更一致,但迁移代码时需要注意导入路径。
8. 不兼容的语法更改
Python 3 移除了一些过时或容易出错的语法结构:
- 不支持 比较运算符,只允许 !=
- 不允许在 lambda 中使用元组解包
- 不允许类定义中使用 __metaclass__ 语法,改用关键字参数
基本上就这些。虽然 Python 2 曾经广泛使用,但官方已于 2020 年停止支持。现在推荐所有新项目直接使用 Python 3,避免兼容问题和安全隐患。










