Python 3.0 新特性全面总结

发布时间:2008 年 12 月 3 日
官方文档:https://docs.python.org/zh-cn/3.0/whatsnew/3.0.html


⚠️ 重要说明:Python 3.0 是 Python 历史上第一个有意为之的向后不兼容版本。Guido 称之为"Python 3000"(Py3k)。它不是简单的增量升级,而是对 Python 2 多年积累的"沉疴旧疾"进行彻底清理。以下变化几乎全部是破坏性变更,迁移需使用 2to3 工具。


一、最容易绊脚的变更(Common Stumbling Blocks)

1. print 变成函数(PEP 3105)

# Python 2
print "The answer is", 2*2
print x,               # 尾部逗号:不换行
print >>sys.stderr, "error"
print                  # 打印空行

# Python 3
print("The answer is", 2*2)
print(x, end=" ")      # 不换行,用空格分隔
print("error", file=sys.stderr)
print()                # 必须加括号

2. 视图和迭代器替代列表

# dict.keys() / items() / values() 返回视图,不再返回列表
d = {'a': 1, 'b': 2}
k = d.keys()
# k.sort()  # 不再有效 → 改用 sorted(d)

# map() / filter() / zip() 返回迭代器,不再返回列表
list(map(str, range(3)))   # 需要时转 list
list(filter(lambda x: x>0, range(-2, 2)))

# range() 替代 xrange(),返回惰性序列
# xrange() 不存在了

# dict.iterkeys() / iteritems() / itervalues() 完全移除

3. 排序比较规则简化

# Python 2:不同类型可以比较(按类型名排序)
# Python 3:抛出 TypeError
1 < None    # TypeError: '<' not supported between instances of 'int' and 'NoneType'
len > dict  # TypeError

# 同一类型的自然顺序不受影响

4. long 废除,统一为 int(PEP 237)

>>> type(2**100)   # 不再有 long 类型
<class 'int'>

# sys.maxint 废除,使用 sys.maxsize
import sys
sys.maxsize  # 平台最大整数

# long 字面量尾部的 L 废除
0xFFFFFFFFFFFFFFFF  # 直接用十六进制,无 L

5. 真除法默认(PEP 238)

# Python 2:1/2 = 0(整数除法)
# Python 3:1/2 = 0.5(真除法)
# 需要截断除法用 //
1 // 2     # 0
-3 // 2    # -2(向下取整)

6. 文本 vs. 二进制(最核心的变更)

# str = 文本(Unicode)  vs.  bytes = 二进制数据
# 两者不可混合,混用直接 TypeError

# u"..." 语法废除(3.0 不支持)
# "hello"  = Unicode 文本
# b"hello" = 字节序列

# 显式编码/解码
s = "你好"
b = s.encode('utf-8')       # str → bytes
s2 = b.decode('utf-8')       # bytes → str

# bytes 是不可变的,可变版本是 bytearray
ba = bytearray(b'hello')
ba[0] = 72

# 文件必须明确模式
open('text.txt', 'r', encoding='utf-8')   # 文本模式
open('binary.bin', 'rb')                  # 二进制模式

二、新语法特性

1. 函数注解(PEP 3107)

def greet(name: str, times: int = 3) -> str:
    return (f"Hello, {name}! " * times).strip()

greet.__annotations__
# {'name': <class 'str'>, 'times': <class 'int'>, 'return': <class 'str'>}
# 注解本身无运行时语义,仅供框架/工具使用

2. 关键字-only 参数(PEP 3102)

def func(a, *args, key=None, **kwargs):
    # *args 之后必须用关键字传参
    print(key)

func(1, 2, 3, key='value')   # key 必须关键字
func(1, key='value')         # key 是 keyword-only

# 纯 keyword-only(无 *args)
def func(*, key=None):
    pass

3. nonlocal 语句(PEP 3104)

def counter():
    count = 0
    def inc(n=1):
        nonlocal count   # 读写外层(非全局)变量
        count += n
        return count
    return inc

4. 扩展解包(PEP 3132)

a, *rest, b = range(5)   # a=0, rest=[1,2,3], b=4

# *rest 可以在任意位置
first, *middle, last = [1, 2, 3, 4, 5]
*prefix, last = [1, 2, 3]   # prefix=[1, 2]

5. 字典推导式

{k: v for k, v in [('a', 1), ('b', 2)]}
{k: v*2 for k, v in d.items() if v > 0}

6. 集合字面量

{1, 2, 3}       # 集合
set()           # 空集合({} 是空字典)
{x for x in range(5)}

7. 类装饰器(PEP 3129)

@decorator
class MyClass:
    pass

8. 新元类语法(PEP 3115)

# Python 2
class C:
    __metaclass__ = M

# Python 3
class C(metaclass=M):
    pass
# 模块级 __metaclass__ 不再支持

9. 异常语法(PEP 3109 / 3134)

# 新的 raise 语法
raise ValueError("invalid input")
raise ValueError() from cause   # 显式异常链
# raise ValueError, args 废除

# except 语法
try:
    ...
except ValueError as e:   # 变量在块结束后自动删除
    pass
# except ValueError, e 废除

三、废除的语法

废除项Python 2Python 3
反引号`x`repr(x)
<>a <> ba != b
exec 语句exec codeexec(code)
u"..." 字面量u"text""text"(默认 Unicode)
尾部 l/L 字面量123L123
函数内 from *from os import *只能在模块顶层
隐式相对导入import osfrom . import os
元组参数解包def f((a, b))def f(x): a, b = x
旧式类class C:class C(object):

四、标准库重组

模块重命名(PEP 3108)

Python 2Python 3
_winregwinreg
ConfigParserconfigparser
copy_regcopyreg
Queuequeue
SocketServersocketserver
__builtin__builtins
StringIO/cStringIOio.StringIO / io.BytesIO
reprreprlib
test.test_supporttest.support

合并为包的模块

包含
dbmanydbm, dbhash, gdbm, whichdb, dumbdbm
htmlHTMLParser, htmlentitydefs
httphttplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib
tkinter所有 Tkinter 相关模块
urlliburllib, urllib2, urlparse, robotparse
xmlrpcxmlrpclib, DocXMLRPCServer, SimpleXMLRPCServer

移除的模块

  • gopherlibmd5(已被 hashlib 替代)、bsddb3
  • sets(使用内置 set()
  • new 模块
  • socket.ssl()(改用 ssl.wrap_socket()

五、异常体系重构

# 异常必须继承 BaseException(字符串异常彻底废除)
# BaseException
#   └── Exception(大多数异常)
#   └── SystemExit
#   └── KeyboardInterrupt
#   └── GeneratorExit

# 推荐捕获所有普通异常
except Exception as e:
    pass

# 异常链
try:
    1/0
except Exception as e:
    raise ValueError("计算错误") from e  # __cause__ = e
# 打印时显示完整异常链 traceback

# __traceback__ 属性可访问
e.__traceback__   # 存储 traceback 对象

六、内置函数变更

变更说明
raw_input()重命名为 input()
input()读取一行并返回字符串(不再 eval)
super()可无参调用(自动选择当前类)
callable()废除 → hasattr(x, '__call__')
apply()废除 → f(*args)
exec()不再是语句 → exec(code)
reduce()移至 functools.reduce()
execfile()废除 → exec(open(fn).read())
file()废除 → open()
dict.has_key()废除 → k in d
coerce()废除(经典类已移除)
reload()废除 → importlib.reload()
intern()移至 sys.intern()
next()重命名为 __next__()
__nonzero__()重命名为 __bool__()
repr() long 尾 L废除(统一用 str)
# super() 无参调用(PEP 3135)
class Child(Parent):
    def method(self):
        super().method()  # 无需传类名

七、其他核心变更

函数属性重命名(func_X → X

def f(): pass
f.__name__      # 'f'(原 func_name)
f.__code__      # code 对象(原 func_code)
f.__defaults__   # 默认参数(原 func_defaults)
f.__closure__   # 闭包(原 func_closure)
f.__globals__   # 全局命名空间(原 func_globals)
f.__doc__       # 文档(原 func_doc)
f.__dict__      # 属性字典(原 func_dict)

切片特殊方法废除

# __getslice__ / __setslice__ / __delslice__ 废除
# a[i:j] 现在统一调用 __getitem__(slice(i, j))

平台特定变更

# 文件名作为 Unicode 字符串传入
# 非 ASCII 标识符允许(PEP 3131)
def 问候(名字):    # 合法
    pass

# 默认源码编码:UTF-8(PEP 3120)
# -*- coding: utf-8 -*-  # 可省略

StringIO/cStringIO 替换

# Python 2
from StringIO import StringIO
from cStringIO import StringIO

# Python 3
from io import StringIO, BytesIO

八、性能说明

Python 3.0 的 pystone 基准测试比 Python 2.5 慢约 10%。主要原因是移除了小整数特殊处理。这个代价是暂时的,后续版本通过大量优化弥补了回来。


总结:Python 3.0 的核心哲学

Python 3.0 不是一个普通的版本升级,而是一次语言设计理念的重新校准。它的核心原则:

  1. 消除 Unicode 混乱 — str/bytes 严格分离,不再有隐式编码
  2. 去除历史包袱 — exec、apply、callable、u"" 等遗留物全部清除
  3. 一致性 — print 是函数,super() 无参调用,函数属性统一 __X__
  4. 显式优于隐式 — 异常链、相对导入、关键字参数全部显式
  5. 视图而非列表 — dict.keys() 返回视图,避免不必要的内存分配

Python 3.0 是 Python 走向成熟的标志。它的不兼容性是有意为之的,目的是让 Python 在下一个十年能够更干净、更安全、更现代化。迁移的痛苦是暂时的,收益是长期的。


参考:Python 3.0 官方文档 - What’s New
内容由 AI 整理生成,内容仅供参考,请仔细甄别。

更多推荐