杰瑞科技汇

Python2与Python3核心差异有哪些?

核心区别总结表

特性 Python 2 Python 3 说明
打印语句 print "Hello" print("Hello") Python 3 将 print 变成一个函数,更符合 Python 的函数式风格。
整数除法 5 / 2 结果是 2 5 / 2 结果是 5 Python 3 的除法行为更符合数学直觉, 总是返回浮点数。
编码 ASCII 是默认编码 UTF-8 是默认编码 Python 3 从根本上解决了字符串和字节流的混乱问题。
Unicode str 是字节,unicode 是字符 str 是 Unicode 字符,bytes 是字节 Python 3 统一了字符串处理,减少了编码错误。
异常处理 except Exception, e: except Exception as e: 语法更清晰,与其它现代语言(如 Java, C#)保持一致。
xrange xrange() 返回一个迭代器 xrange 被移除,range() 返回一个迭代器 Python 3 中的 range() 效率更高,等同于 Python 2 的 xrange()
输入函数 raw_input() input() Python 3 的 input() 等同于 Python 2 的 raw_input(),更安全。
next() 函数 .next() 方法 next() 函数 Python 3 将迭代器的下一个值方法统一为一个内置函数 next()
yield 表达式 yield 是一个语句 yield 是一个表达式 这使得 yield 可以用于更复杂的表达式,如 result = yield value
库的导入 import urlparse from urllib.parse import urlparse Python 3 对标准库进行了重组和重命名,使其更有条理。
列表推导式 可能泄露变量到外部作用域 不会泄露变量到外部作用域 Python 3 修复了列表推导式的一个潜在作用域问题。

详细解释

print 的变化

这是最直观的区别之一。

Python2与Python3核心差异有哪些?-图1
(图片来源网络,侵删)
  • Python 2: print 是一个语句,后面直接跟要打印的内容。
    print "Hello, World!"
    print "Hello", "World"  # 输出: Hello World (带空格分隔)
  • Python 3: print 是一个函数,必须使用括号。
    print("Hello, World!")
    print("Hello", "World")  # 输出: Hello World (带空格分隔)
    # 要实现不换行,需要使用 end 参数
    print("Hello", end=" ")
    print("World") # 输出: Hello World

整数除法

这是在数学计算上最重大的变化,也是为了修复一个长期存在的陷阱。

  • Python 2: 当两个整数相除时,结果会自动截断为整数。
    >>> 5 / 2
    2
    >>> -5 / 2
    -3  # 向下取整
  • Python 3: 总是执行“真除法”,返回浮点数,如果需要整数除法,必须使用 运算符。
    >>> 5 / 2
    2.5
    >>> -5 / 2
    -2.5
    >>> 5 // 2  # 整数除法
    2

字符串与编码

这是 Python 3 最重要的改进之一,旨在彻底解决 Python 2 中令人头疼的字符串编码问题。

  • Python 2:
    • str: 字节串,是内存中原始的字节序列。
    • unicode: Unicode 字符串,是抽象的字符集合。
    • 经常需要在 strunicode 之间转换,容易出错。
      # Python 2
      s = "你好"  # 这是一个 str (字节串,通常是 UTF-8 或 GBK 编码)
      u = u"你好" # 这是一个 unicode
      print s.decode('utf-8')  # 将 str 解码为 unicode
      print u.encode('utf-8')  # 将 unicode 编码为 str
  • Python 3:
    • str: 表示 Unicode 字符串,是文本。
    • bytes: 表示字节序列,是二进制数据。
    • 两者之间有明确的区分,转换必须显式进行。
      # Python 3
      s = "你好"  # 这是一个 str (Unicode 字符串)
      b = b"hello" # 这是一个 bytes (字节串)
      print(s.encode('utf-8')) # 将 str 编码为 bytes
      print(b.decode('utf-8')) # 将 bytes 解码为 str

异常处理语法

  • Python 2: 使用逗号来捕获异常变量。
    try:
        # some code
    except ValueError, e:  # 注意这里的逗号
        print e
  • Python 3: 使用 as 关键字,语法更清晰,与其他语言一致。
    try:
        # some code
    except ValueError as e:  # 使用 as 关键字
        print(e)

xrangerange

  • Python 2: range() 会返回一个完整的列表,如果数字很大,会占用大量内存。xrange() 返回一个迭代器,只在需要时生成下一个值,内存效率高。
  • Python 3: range() 的行为被修改为等同于 Python 2 的 xrange(),它返回的是一个 range 对象(一个高效的序列类型)。xrange 这个名字被移除了,如果你需要一个列表,可以使用 list(range(1000000))

输入函数

  • Python 2: 有两个输入函数。
    • input(): 期望用户输入一个 Python 表达式(如数字、列表等),不安全。
    • raw_input(): 总是将用户输入作为字符串返回,安全且常用。
  • Python 3: 移除了 raw_input(),保留了 input(),其行为等同于 Python 2 的 raw_input(),总是返回字符串。

标准库重组和重命名

Python 3 对标准库进行了一些调整,使其更加合理和一致。

  • urlparse 模块: 在 Python 2 中,urlparseurlparse2 等模块功能有重叠,在 Python 3 中,它们被整合到 urllib.parse

    Python2与Python3核心差异有哪些?-图2
    (图片来源网络,侵删)
    # Python 2
    import urlparse
    parsed = urlparse.urlparse("http://www.example.com")
    # Python 3
    from urllib.parse import urlparse
    parsed = urlparse("http://www.example.com")
  • 其他例子:ConfigParser -> configparserQueue -> queuecPickle -> pickle (C 实现被默认使用)。


为什么从 Python 2 迁移到 Python 3?

  1. 官方支持已停止: Python 2.7 在 2025 年 1 月 1 日后不再维护,这意味着它不会再收到任何安全补丁、错误修复或功能更新,使用 Python 2 的代码将面临安全风险。
  2. 语言本身的改进: Python 3 修复了 Python 2 中的许多设计缺陷(如整数除法、字符串编码),使得语言更一致、更易用、更安全。
  3. 现代化的库和框架: 所有的主流库(如 Django, Flask, NumPy, Pandas)都已经停止对 Python 2 的支持,并发布了只兼容 Python 3 的新版本,为了使用最新的库和功能,必须迁移到 Python 3。
  4. 未来发展方向: Python 3 是 Python 语言的未来,所有的创新和新功能都会在 Python 3 上开发。

如何处理兼容性问题?

如果你需要同时维护 Python 2 和 Python 3 的代码,可以使用 __future__ 模块,它允许你在 Python 2 中导入 Python 3 的一些特性。

# Python 2 代码
from __future__ import print_function  # 使 print 成为一个函数
from __future__ import division       # 使 / 执行真除法
print("Hello, World!")
print(5 / 2) # 输出 2.5

可以使用如 sixfuture 这样的第三方库来编写兼容两个版本的代码,但这通常会增加代码的复杂性,最佳实践是尽早迁移到 Python 3。

Python 2 和 Python 3 是两个完全不同的语言版本,Python 3 是当前的标准,并且是未来的发展方向,对于任何新项目,都应该毫不犹豫地选择 Python 3,对于旧的 Python 2 项目,应制定计划尽快迁移到 Python 3,以确保代码的安全性、可维护性和能够使用最新的生态系统。

Python2与Python3核心差异有哪些?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇