杰瑞科技汇

Python 2与3,该选哪个?

Python 3 是 Python 语言的现在和未来,Python 2 已在 2025 年 1 月 1 日正式停止维护,这意味着它不再接收任何更新、修复或安全补丁,所有新的开发项目都应该使用 Python 3。

Python 2与3,该选哪个?-图1
(图片来源网络,侵删)

为什么会有 Python 3?

Python 3 的诞生是为了解决 Python 2 中存在的一些设计缺陷和“历史包袱”,主要是为了:

  1. 消除语言中的歧义和不一致性:整数除法、print 语句等。
  2. 改进 Unicode 支持:Python 2 的 Unicode 处理非常混乱,而 Python 3 从根本上解决了这个问题。
  3. 清理代码库:移除了一些过时和不推荐的模块和功能。
  4. 为语言的长期发展奠定基础:Python 3 的设计更具前瞻性,更容易进行后续的功能扩展。

Python 2 vs Python 3:主要区别

下面是两者之间最核心、最显著的区别。

a. print 语句 vs print() 函数

这是最直观的区别。

  • Python 2: print 是一个语句,不需要括号。
    print "Hello, World!"
    print "Hello", "World"  # 输出: Hello World (带空格分隔)
  • Python 3: print 是一个函数,必须使用括号。
    print("Hello, World!")
    print("Hello", "World")  # 输出: Hello World (带空格分隔)
    # 注意:print("Hello", "World", sep="") 可以去掉空格

b. 整数除法

这是 Python 2 中一个非常常见的陷阱。

Python 2与3,该选哪个?-图2
(图片来源网络,侵删)
  • Python 2: 两个整数相除,结果会截断小数部分,返回一个整数。
    >>> 5 / 2
    2  # 结果是整数 2,而不是 2.5
  • Python 3: 除法 总是返回一个浮点数,如果需要整数除法,使用 运算符。
    >>> 5 / 2
    2.5  # 结果是浮点数 2.5
    >>> 5 // 2
    2   # // 是整数除法

c. Unicode vs. Bytes (字符串处理)

这是两者之间最重要的区别,也是从 Python 2 迁移到 Python 3 最困难的部分。

  • Python 2:

    • 有两种字符串类型:strunicode
    • str 是字节串,直接存储原始字节。
    • unicode 是 Unicode 字符串,是抽象的字符表示。
    • 这导致了大量的编码/解码问题,UnicodeDecodeErrorUnicodeEncodeError
      # Python 2
      s = "你好"  # 这是一个 str (字节串),通常编码是 ASCII 或系统默认编码
      u = u"你好" # 这是一个 unicode
      # s 包含非 ASCII 字符,直接拼接会报错
      # "hello" + s  # 可能会报错
  • Python 3:

    • 只有一种字符串类型:str,它表示 Unicode 字符串。
    • 引入了 bytes 类型来表示字节串。
    • 字符串和字节串之间的转换是明确且必须的。
      # Python 3
      s = "你好"  # 这是一个 str (Unicode 字符串)
      b = s.encode('utf-8')  # 将 Unicode 字符串编码成字节串
      print(b)  # 输出: b'\xe4\xbd\xa0\xe5\xa5\xbd'

    s2 = b.decode('utf-8') # 将字节串解码成 Unicode 字符串 print(s2) # 输出: 你好

    Python 2与3,该选哪个?-图3
    (图片来源网络,侵删)

d. xrange vs range

  • Python 2: range() 返回一个完整的列表,当数字很大时会消耗大量内存。xrange() 返回一个迭代器,它不会一次性生成所有数字,更节省内存。
    # Python 2
    r = xrange(1000000) # 节省内存
    l = range(1000000)   # 可能会占用大量内存
  • Python 3: range() 的行为和 Python 2 的 xrange() 一样,返回一个迭代器。xrange() 不再存在。
    # Python 3
    r = range(1000000) # 节省内存,是一个 range 对象(迭代器)
    # l = list(range(1000000)) # 如果需要列表,可以显式转换

e. 异常处理语法

  • Python 2: 使用逗号来捕获异常变量。
    # Python 2
    try:
        # something
    except ValueError, e:  # 语法是 except <Exception>, <variable>
        print(e)
  • Python 3: 使用 as 关键字,这与其他现代语言(如 Java, C#)的语法一致。
    # Python 3
    try:
        # something
    except ValueError as e: # 语法是 except <Exception> as <variable>
        print(e)

f. 迭代器 .next() 方法

  • Python 2: 迭代器有一个 .next() 方法来获取下一个元素。
    # Python 2
    my_iter = iter([1, 2, 3])
    print(my_iter.next()) # 输出: 1
  • Python 3: .next() 方法被内置的 next() 函数取代。
    # Python 3
    my_iter = iter([1, 2, 3])
    print(next(my_iter)) # 输出: 1
    # 为了向后兼容,迭代器也保留了 __next__ 方法

g. 其他重要区别

特性 Python 2 Python 3
输入函数 raw_input() input() (Python 2 的 input() 有安全风险)
字典的 .keys(), .values(), .items() 返回列表 返回视图对象,更节省内存
map, filter, zip 返回列表 返回迭代器
super() super(ChildClass, self).method() super().method() (更简洁)
运算符 整数除法 真除法
import 语句 相对导入语法 from . import module 相对导入语法更清晰

如何处理兼容性问题?(__future__ 导入)

在 Python 2 的后期版本中,可以通过 __future__ 模块来导入 Python 3 的某些特性,从而让 Python 2 代码更接近 Python 3 的写法,便于后续迁移。

# Python 2 代码
from __future__ import print_function  # 使用 print() 函数语法
from __future__ import division       # 使用 Python 3 的除法规则
print("Hello")
print(5 / 2) # 输出 2.5

迁移指南

如果你有一个旧的 Python 2 项目,需要迁移到 Python 3,可以遵循以下步骤:

  1. 使用自动化工具

    • 2to3: Python 自带的工具,可以自动将大部分 Python 2 代码转换为 Python 3 代码,但它不是万能的,特别是对于 Unicode 和第三方库的处理。
    • modernize: 一个更智能的第三方工具,它会使用 __future__ 导入和一些其他技巧,让代码在 Python 2 和 Python 3 上都能运行,为最终迁移到 Python 3 铺路。
    • six: 一个兼容性库,让你可以在代码中同时支持 Python 2 和 Python 3,但通常不推荐在新项目中使用,因为它增加了代码的复杂性。
  2. 手动修改:自动化工具无法处理所有问题,特别是:

    • 字符串处理:这是最需要手动审查和修改的部分,确保所有文本数据都使用 unicode (Python 2) 或 str (Python 3),所有二进制数据都使用 bytes
    • 第三方库:检查你使用的所有第三方库是否已经提供了 Python 3 版本,许多库已经停止支持 Python 2。
    • API 变更:仔细检查代码中使用了哪些在 Python 3 中被移除或改变行为的函数/方法。

总结与建议

Python 2 Python 3
状态 已停止维护 (EOL) 当前和未来
安全 有安全风险 安全
社区 停止更新,新包越来越少 活跃,所有新包都支持
特性 有历史包袱,设计不一致 现代化,清晰,一致

给开发者的最终建议:

  1. 新项目绝对不要再使用 Python 2,直接选择 Python 3,目前最新的稳定版本是 Python 3.10+,它们带来了许多优秀的性能改进和新特性(如海象运算符 、模式匹配等)。
  2. 维护旧项目:如果必须维护一个 Python 2 项目,首要任务是制定一个迁移计划,并尽快迁移到 Python 3,不要指望 Python 2 会“一直工作下去”,它随时可能出现无法修复的安全漏洞。
  3. 学习:如果你是初学者,请直接学习 Python 3,市面上绝大多数优质教程、书籍和课程都是基于 Python 3 编写的。

一句话总结:拥抱 Python 3,它是 Python 语言发展的正确方向。

分享:
扫描分享到社交APP
上一篇
下一篇