杰瑞科技汇

Python 3.x与2.x核心区别有哪些?

Python 3 是现在和未来的标准,而 Python 2 已在 2025 年 1 月 1 日停止官方支持,不再维护,所有新项目都应该使用 Python 3。

下面我将从多个维度详细对比两者的核心区别。


核心差异概览

特性 Python 2.x Python 3.x 备注
print 语句 print "Hello, World!" (是语句) print("Hello, World!") (是函数) Python 3 中 print 是一个函数,必须加括号。
整数除法 5 / 2 结果是 2 (整数除法) 5 / 2 结果是 5 (浮点除法) Python 3 更符合数学直觉。 用于整数除法。
Unicode 支持 str 是字节串,unicode 是文本 str 是文本 (Unicode), bytes 是字节串 Python 3 将 Unicode 作为字符串的标准,解决了编码混乱问题。
xrange 函数 xrange(10) (返回一个 xrange 对象) 已移除 Python 3 中 range() 返回的是一个类似 xrange 的对象,内存效率更高。
异常处理 except Exception, e: (逗号分隔) except Exception as e: (as 关键字) 语法更清晰,与其他语言(如 Java, C++)保持一致。
input() 函数 input() 会将输入作为代码执行 input() 总是返回字符串 Python 2 的 input() 有安全风险,Python 3 的 input() 等同于 Python 2 的 raw_input()
是整数除法, 是地板除法 是真除法, 是地板除法 Python 3 的 更符合直觉, 明确表示取整。
next() 函数 迭代器的 .next() 方法 迭代器的 next() 函数 next() 是一个内置函数,而不是方法。
super() 函数 super(ChildClass, self).method() super().method() Python 3 的 super() 用法更简洁,能自动获取实例和类。
关键字 async, await 引入了 async, await 用于支持异步编程 (asyncio)。
标准库 部分库已过时或功能有限 包含更现代、功能更强的库 asyncio, typing 等只在 Python 3 中可用。

关键区别详解

print 的变化:从语句到函数

这是最直观、最容易发现的区别。

  • Python 2: print 是一个语句,可以不加括号。
    print "Hello, Python 2"
    print "a", "b" # 输出 a b (有空格分隔)
  • Python 3: print 是一个函数,必须使用括号,这使得 print 可以像其他函数一样被赋值、作为参数传递等,行为更一致。
    print("Hello, Python 3")
    print("a", "b") # 输出 a b (有空格分隔)
    # 你可以像使用普通函数一样使用它
    import sys
    print("Hello", file=sys.stderr) # 输出到标准错误

整数除法:更符合数学直觉

这是 Python 3 修复的一个重大设计缺陷。

  • Python 2: 当两个整数相除时,结果会自动截断为整数。

    >>> 5 / 2
    2
    >>> 5 / 2.0 # 如果其中一个数是浮点数,结果就是浮点数
    2.5

    这常常会给初学者带来困扰,不符合数学上的除法概念。

  • Python 3: 除法 总是返回浮点数(真除法),除非你明确使用地板除法 。

    >>> 5 / 2
    2.5
    >>> 5 // 2 # 地板除法,向下取整
    2

    这个改动让代码行为更可预测,更符合直觉。

字符串与 Unicode:编码问题的终结

这是 Python 3 最重要、最底层的改进之一,解决了 Python 2 中长期存在的编码混乱问题。

  • Python 2:

    • str: 字节串,它在内存中就是原始的字节序列,不包含任何编码信息,处理非 ASCII 字符非常麻烦。
    • unicode: Unicode 字符串,它是一个真正的文本字符串,可以包含任何语言的字符。
    • 开发者需要时刻在 strunicode 之间进行转换,容易出错。
    # Python 2
    s = "你好" # 这是一个 str (字节串,通常是 UTF-8 或 GBK)
    u = u"你好" # 这是一个 unicode
    # 如果要打印,可能需要转换
    print u.encode('utf-8') # 将 unicode 编码成 str
  • Python 3:

    • str: 就是文本字符串,它在内存中存储的是 Unicode 码点,可以无缝处理多语言字符。
    • bytes: 字节串,当你需要处理二进制数据(如文件读写、网络传输)时使用它。
    • 这种分离使得文本处理和二进制处理变得清晰明了。
    # Python 3
    s = "你好" # 这是一个 str (Unicode 文本)
    b = s.encode('utf-8') # 将 str 编码成 bytes
    print(b) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
    u = b.decode('utf-8') # 将 bytes 解码成 str
    print(u) # 输出 你好

迭代器与 range

  • Python 2:

    • range(): 返回一个完整的 list,当生成一个很大的范围时(如 range(100000000)),会占用大量内存。
    • xrange(): 返回一个 xrange 对象,这是一个“惰性求值”的迭代器,它只在需要时生成下一个值,内存效率极高。
  • Python 3:

    • range(): xrange() 的功能被合并到了 range() 中。range() 现在返回的是一个 range 对象,它是一个序列类型,行为类似于 xrange,内存效率高。
    • xrange(): 已被完全移除。
    # Python 3
    r = range(1000000)
    print(type(r)) # <class 'range'>
    # 它不会立即生成 100 万个数字,而是在循环时按需生成
    for i in r:
        pass

代码可读性改进

  • 异常处理:

    • Python 2: except Exception, e: (使用逗号)
    • Python 3: except Exception as e: (使用 as 关键字)。as 是 Python 中处理异常绑定变量的标准方式,语法更清晰。
  • super() 函数:

    • Python 2: super(ChildClass, self).method() 需要显式传入子类和实例。
    • Python 3: super().method(),在类方法中,super() 可以自动推断出当前的类和实例,代码更简洁。

输入函数

  • Python 2:

    • input(): 会将用户输入的字符串当作 Python 表达式来执行。这非常危险!
      # Python 2
      # 用户输入 "__import__('os').system('rm -rf /')"
      # 这将删除整个文件系统!
      my_var = input()
    • raw_input(): 安全的函数,总是将输入作为字符串返回。
  • Python 3:

    • input(): 总是返回字符串,行为等同于 Python 2 的 raw_input()raw_input() 已被移除。

如何迁移代码?

由于 Python 2 和 3 不兼容,将 Python 2 代码迁移到 Python 3 是一个常见的任务,主要方法有:

  1. 手动修改: 根据上述差异,逐行修改代码,适用于小型项目。
  2. 使用 2to3 工具: Python 自带一个名为 2to3 的脚本,它可以自动分析你的 Python 2 代码并将其转换为 Python 3 代码,但它不能处理所有情况,特别是依赖了特定库的逻辑,所以通常还需要人工审查和修改。
  3. 使用兼容库(如 six: six 是一个专门用于编写兼容 Python 2 和 Python 3 的库的第三方库,它提供了一些函数和类,让你可以用同一套代码在两个版本上运行,这种方法在 Python 2 末期非常流行,但现在新项目已无必要使用。

总结与建议

Python 2.x Python 3.x
状态 已停止维护 (2025-01-01) 当前和未来的标准
语法 有一些过时且不直观的语法 现代化、清晰、一致
核心特性 字节串优先,整数除法,print 语句 Unicode优先,真除法,print 函数
生态 许多旧库仍在使用,但不再更新 所有新库、新框架都基于 Python 3 开发
未来 唯一的发展方向

最终建议:

  • 所有新项目、新学习,都必须使用 Python 3。
  • 如果你在维护一个古老的 Python 2 项目,并且无法立即迁移,那么你需要承担其安全风险(因为没有安全补丁),并尽快制定迁移计划。
  • 对于开发者来说,掌握 Python 3 是必备技能,Python 3 的设计哲学更清晰,功能更强大,社区也更活跃。
分享:
扫描分享到社交APP
上一篇
下一篇