On this page

Python2.x 与 3​​.x 版本区别

Python 2.x 与 Python 3.x 的主要区别

Python 3.x 是 Python 语言的未来,而 Python 2.x 已于 2020 年 1 月 1 日正式停止支持。以下是它们之间的主要区别:

1. 打印函数

Python 2.x:

print "Hello World"  # 作为语句使用
print "Hello", "World"  # 输出: ('Hello', 'World')

Python 3.x:

print("Hello World")  # 作为函数使用
print("Hello", "World")  # 输出: Hello World

2. 整数除法

Python 2.x:

5 / 2     # 结果为 2 (整数除法)
5.0 / 2   # 结果为 2.5 (浮点除法)

Python 3.x:

5 / 2     # 结果为 2.5 (总是浮点除法)
5 // 2    # 结果为 2 (显式整数除法)

3. Unicode 支持

Python 2.x:

str_type = "你好"     # 字节字符串
unicode_type = u"你好"  # Unicode 字符串

Python 3.x:

str_type = "你好"     # Unicode 字符串 (默认)
bytes_type = b"hello"  # 字节字符串

4. xrange 与 range

Python 2.x:

range(10)    # 返回列表 [0, 1, 2, ..., 9]
xrange(10)   # 返回迭代器 (内存效率更高)

Python 3.x:

range(10)    # 返回 range 对象 (类似 Python 2.x 的 xrange)
list(range(10))  # 转换为列表 [0, 1, 2, ..., 9]

5. 异常处理

Python 2.x:

try:
    # 可能出错的代码
except Exception, e:  # 逗号语法
    # 处理异常

Python 3.x:

try:
    # 可能出错的代码
except Exception as e:  # as 语法
    # 处理异常

6. 输入函数

Python 2.x:

raw_input()  # 返回字符串
input()      # 等同于 eval(raw_input())

Python 3.x:

input()      # 等同于 Python 2.x 的 raw_input()

7. 字典方法

Python 2.x:

d = {1: "one"}
d.keys()    # 返回列表 [1]
d.values()  # 返回列表 ["one"]
d.items()   # 返回列表 [(1, "one")]

Python 3.x:

d = {1: "one"}
d.keys()    # 返回 dict_keys 视图对象
d.values()  # 返回 dict_values 视图对象
d.items()   # 返回 dict_items 视图对象

8. 迭代器方法

Python 2.x:

# 许多方法返回列表
map(lambda x: x*2, [1,2,3])  # 返回 [2, 4, 6]

Python 3.x:

# 许多方法返回迭代器
map(lambda x: x*2, [1,2,3])  # 返回 map 对象
list(map(lambda x: x*2, [1,2,3]))  # 转换为列表 [2, 4, 6]

9. 类定义

Python 2.x:

class MyClass:
    pass  # 旧式类

class MyClass(object):
    pass  # 新式类

Python 3.x:

class MyClass:
    pass  # 总是新式类

10. 其他重要区别

  1. 语法变化:

    • Python 3.x 不再支持 <> 运算符,只能用 !=
    • Python 3.x 要求异常参数用括号括起来
  2. 标准库变化:

    • urlliburllib2 合并为 urllib
    • ConfigParser 重命名为 configparser
    • StringIO 模块移动到 io 模块中
  3. 性能改进:

    • Python 3.x 在性能上有许多优化
    • 字典实现更高效
    • 内存管理改进
  4. 向后兼容性:

    • Python 3.x 不向后兼容 Python 2.x 代码
    • 提供了 2to3 工具帮助迁移代码

迁移建议

  1. 使用 __future__ 导入在 Python 2.x 中使用 Python 3.x 的特性:

    from __future__ import print_function
    from __future__ import division
    from __future__ import absolute_import
    from __future__ import unicode_literals
    
  2. 使用兼容性库如 six 来编写同时支持 Python 2.x 和 3.x 的代码

  3. 逐步迁移:

    • 先确保代码在 Python 2.x 下能通过所有测试
    • 使用 2to3 工具转换代码
    • 修复转换后的代码使其在 Python 3.x 下工作

结论

Python 3.x 是 Python 的未来,新项目应该直接使用 Python 3.x。对于现有项目,建议尽快迁移到 Python 3.x,因为 Python 2.x 已不再维护且不再接收安全更新。