Python3 和 Python2 是两个长期并行的版本,但 Python3 在语法、功能和设计理念上进行了多项改进。尤其是迁移旧项目或编写兼容代码时。以下是二者的核心差异及代码示例:
1. Print 函数:从语句到函数
Python2 中 print
是语句,而 Python3 将其改为函数,支持更灵活的调用方式。
Python2:
print "Hello World" # 无需括号
Python3:
print("Hello World") # 必须使用括号
2. 整数除法行为
Python3 的除法更符合数学直觉,而 Python2 的整数除法会直接截断。
Python2:
print 3 / 2 # 输出 1(整数除法)
print 3 // 2 # 输出 1(显式整除)
Python3:
print(3 / 2) # 输出 1.5(浮点数结果)
print(3 // 2) # 输出 1(显式整除)
3. Unicode 字符串
Python3 默认使用 Unicode 字符串,而 Python2 需显式声明。
Python2:
s = '中文' # 字节字符串(可能引发编码错误)
u = u'unicode文本' # 需显式声明 Unicode
Python3:
s = '中文' # 直接支持 Unicode
b = b'byte string' # 字节字符串需显式声明
4. 迭代器与生成器
Python3 优化了迭代器行为,range
和字典方法更高效。
Python2:
range(5) # 生成列表 [0,1,2,3,4]
xrange(5) # 生成迭代器(节省内存)
d = {'a':1}; d.items() # 返回键值对列表
Python3:
range(5) # 直接生成迭代器
d = {'a':1}; d.items() # 返回视图对象(动态反映字典变化)
5. 异常处理语法
Python3 要求更严格的异常捕获语法。
Python2:
try:raise ValueError
except ValueError, e: # 使用逗号分隔print str(e)
Python3:
try:raise ValueError
except ValueError as e: # 必须使用 as 关键字print(e)
6. 输入函数
Python3 统一了输入函数,避免安全风险。
Python2:
name = raw_input("Enter name: ") # 返回字符串
age = input("Enter age: ") # 自动求值(如输入 10+5 会返回 15)
Python3:
name = input("Enter name: ") # 直接返回字符串(等效于 Python2 的 raw_input)
7. 元类(Metaclass)语法
Python3 简化了元类定义方式。
Python2:
class MyClass(object):__metaclass__ = MyMeta # 在类内部指定元类
Python3:
class MyClass(metaclass=MyMeta): # 通过参数声明pass
8. 其他关键区别
- 八进制表示:Python3 使用
0o777
替代 Python2 的0777
。 - 函数注解:Python3 支持类型注解(如
def func(a: int) -> str:
)。 - 协程语法:Python3.5+ 引入
async
和await
关键字。
迁移建议
- 使用
2to3
工具自动转换代码。 - 在 Python2 代码中添加
__future__
导入(如from __future__ import print_function
)以兼容 Python3。 - 优先使用 Python3 的语法特性编写新项目。