杰瑞科技汇

python3 python2 区别

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

python3 python2 区别-图1
(图片来源网络,侵删)

下面我将从几个核心方面详细解释它们的区别。


核心区别概览表

特性 Python 2 Python 3 说明
官方支持 已停止 (EOL) 活跃开发 这是最重要的原因,新项目必须用 Python 3。
print 语句 print "Hello" print("Hello") Python 3 中 print 是一个函数,必须加括号。
整数除法 5 / 2 结果是 2 5 / 2 结果是 5 Python 2 中 是整数除法, 是地板除法,Python 3 中 是真除法。
Unicode 支持 str 是字节串,unicode 是文本 str 是文本,bytes 是字节串 Python 3 默认使用 Unicode,更好地处理多语言文本。
异常处理 except Exception, e: except Exception as e: Python 3 使用更符合现代语言习惯的 as 关键字。
xrange 函数 xrange(10) 生成迭代器 range(10) 就是迭代器 Python 3 中 range 返回的是一个类似 xrange 的对象,更节省内存。xrange 已被移除。
input() 函数 input() 会将输入作为代码执行 input() 总是将输入作为字符串返回 Python 2 的 input() 有安全风险,Python 3 的 input() 相当于 Python 2 的 raw_input()
迭代器 .next() iterator.next() next(iterator) Python 3 将 .next() 方法移除,统一使用内置的 next() 函数。
关键字 - async, await Python 3.5+ 引入了异步编程的关键字。

核心差异详解

print 从语句变为函数

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

  • Python 2:

    print "Hello, World!"
    print "Hello", "World"  # 输出: Hello World (默认用空格分隔)
  • Python 3:

    python3 python2 区别-图2
    (图片来源网络,侵删)
    print("Hello, World!")
    print("Hello", "World")  # 输出: Hello World (默认用空格分隔)
    # 如果不想换行,需要添加 end 参数
    print("Hello", end=" ")
    print("World")

    优势:作为函数,print 更加灵活和一致,可以像其他函数一样使用参数(如 sep, end)。

整数除法的改变

这是导致许多旧代码在 Python 3 中出现意外错误的主要原因。

  • Python 2:

    # / 是整数除法(如果操作数都是整数)
    result = 5 / 2
    print(result)  # 输出: 2
    # // 是地板除法
    floor_result = 5 // 2
    print(floor_result)  # 输出: 2
  • Python 3:

    python3 python2 区别-图3
    (图片来源网络,侵删)
    # / 是“真除法”,总是返回浮点数
    result = 5 / 2
    print(result)  # 输出: 2.5
    # // 是地板除法
    floor_result = 5 // 2
    print(floor_result)  # 输出: 2

    优势:数学行为更符合直觉,减少了因整数除法导致的精度丢失问题。

Unicode 字符串处理

这是两个版本在处理文本和二进制数据上的根本性区别。

  • Python 2:

    # str 是字节串,bytes
    s = "你好"  # 这实际上是字节串,如果文件编码是 GBK,它存储的是 'C4 E3 BA C3'
    # unicode 是真正的文本类型
    u = u"你好"  # 这是 unicode 对象
    # 需要手动编码和解码
    s_to_u = s.decode('utf-8')  # 字节串 -> unicode
    u_to_s = u.encode('utf-8')  # unicode -> 字节串

    问题:默认的 str 类型很容易在不同编码环境下引发 UnicodeDecodeErrorUnicodeEncodeError

  • Python 3:

    # str 是真正的文本类型,默认是 Unicode
    s = "你好"  # 这是 str 对象,unicode
    # bytes 是字节串
    b = b"hello" # 这是 bytes 对象
    # 编码和解码更清晰
    s_to_b = s.encode('utf-8')  # str -> bytes
    b_to_s = b.decode('utf-8')  # bytes -> str

    优势:默认使用 Unicode 使得处理多语言文本(如中文、日文、阿拉伯文)变得更加简单和安全,减少了编码相关的错误。

其他重要语法和库的变化

  • 异常处理 (try...except...raise)

    • Python 2:
      try:
          # some code
      except MyError, e:  # 逗号
          pass
      raise MyError, "error message"  # 逗号
    • Python 3:
      try:
          # some code
      except MyError as e:  # as 关键字
          pass
      raise MyError("error message")  # 像调用函数一样

      优势:语法更清晰,与其他现代编程语言(如 Java, C++)保持一致。

  • input() 函数

    • Python 2:

      # raw_input() 总是返回字符串
      name = raw_input("What's your name? ") 
      # input() 会将输入的内容当作 Python 代码执行,有安全风险!
      age = input("How old are you? ") # 如果用户输入 "20 + 5",age 会是 25
    • Python 3:

      # input() 总是返回字符串,相当于 Python 2 的 raw_input()
      name = input("What's your name? ")
      age = input("How old are you? ") # 无论用户输入什么,age 都是字符串

      优势:消除了安全隐患,行为更符合预期。

  • xrange vs range

    • Python 2: range(1000000) 会立即生成一个包含 100 万个数字的列表,占用大量内存。xrange(1000000) 返回一个迭代器,只在需要时生成数字,非常节省内存。
    • Python 3: range(1000000) 的行为与 xrange 相同,返回的是一个 range 对象(一个惰性计算的序列),不再有 xrange 这个函数。

如何迁移代码?

如果你有一个 Python 2 的项目需要迁移到 Python 3,可以使用官方提供的工具 2to3

  1. 安装:Python 自带,或通过 pip install 2to3 安装。
  2. 运行:在命令行中执行 2to3 your_python2_script.py
  3. 检查:工具会输出修改建议,并可以自动生成一个转换后的新文件。

注意2to3 可以处理大部分语法差异,但对于一些逻辑上的差异(如整数除法、unicode 处理),可能需要人工审查和修改,更推荐的做法是使用 six 这样的兼容库来编写兼容两个版本的代码,但这只是一种过渡方案。

Python 2 Python 3
定位 历史版本,已停止维护 当前和未来标准
设计哲学 更贴近早期语言习惯 更现代化、清晰、一致
适用场景 维护极少数遗留系统 所有新项目
核心改进 - print 函数、真除法、Unicode 默认支持、更安全的 input

如果你是初学者,或者开始一个新项目,请毫不犹豫地选择 Python 3,它拥有更清晰的语法、更好的 Unicode 支持、更活跃的社区和持续的功能更新,Python 2 只在你需要维护一个旧系统时才会遇到。

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