Python 3.0 新特性全面总结
发布时间:2008 年 12 月 3 日
⚠️ 重要说明 :Python 3.0 是 Python 历史上第一个有意为之的向后不兼容 版本。Guido 称之为"Python 3000"(Py3k)。它不是简单的增量升级,而是对 Python 2 多年积累的"沉疴旧疾"进行彻底清理。以下变化几乎全部是破坏性变更 ,迁移需使用
2to3工具。
一、最容易绊脚的变更(Common Stumbling Blocks)
1. print 变成函数(PEP 3105)
python
# 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. 视图和迭代器替代列表
python
# 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
# Python 2:不同类型可以比较(按类型名排序)
# Python 3:抛出 TypeError
1 < None # TypeError: '<' not supported between instances of 'int' and 'NoneType'
len > dict # TypeError
# 同一类型的自然顺序不受影响
4. long 废除,统一为 int(PEP 237)
python
>>> type(2**100) # 不再有 long 类型
<class 'int'>
# sys.maxint 废除,使用 sys.maxsize
import sys
sys.maxsize # 平台最大整数
# long 字面量尾部的 L 废除
0xFFFFFFFFFFFFFFFF # 直接用十六进制,无 L
5. 真除法默认(PEP 238)
python
# Python 2:1/2 = 0(整数除法)
# Python 3:1/2 = 0.5(真除法)
# 需要截断除法用 //
1 // 2 # 0
-3 // 2 # -2(向下取整)
6. 文本 vs. 二进制(最核心的变更)
python
# 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)
python
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)
python
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)
python
def counter():
count = 0
def inc(n=1):
nonlocal count # 读写外层(非全局)变量
count += n
return count
return inc
4. 扩展解包(PEP 3132)
python
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. 字典推导式
python
{k: v for k, v in [('a', 1), ('b', 2)]}
{k: v*2 for k, v in d.items() if v > 0}
6. 集合字面量
python
{1, 2, 3} # 集合
set() # 空集合({} 是空字典)
{x for x in range(5)}
7. 类装饰器(PEP 3129)
python
@decorator
class MyClass:
pass
8. 新元类语法(PEP 3115)
python
# Python 2
class C:
__metaclass__ = M
# Python 3
class C(metaclass=M):
pass
# 模块级 __metaclass__ 不再支持
9. 异常语法(PEP 3109 / 3134)
python
# 新的 raise 语法
raise ValueError("invalid input")
raise ValueError() from cause # 显式异常链
# raise ValueError, args 废除
# except 语法
try:
...
except ValueError as e: # 变量在块结束后自动删除
pass
# except ValueError, e 废除
三、废除的语法
| 废除项 | Python 2 | Python 3 |
|---|---|---|
| 反引号 | x |
repr(x) |
<> |
a <> b |
a != b |
exec 语句 |
exec code |
exec(code) |
u"..." 字面量 |
u"text" |
"text"(默认 Unicode) |
尾部 l/L 字面量 |
123L |
123 |
函数内 from * |
from os import * |
只能在模块顶层 |
| 隐式相对导入 | import os |
from . import os |
| 元组参数解包 | def f((a, b)) |
def f(x): a, b = x |
| 旧式类 | class C: |
class C(object): |
四、标准库重组
模块重命名(PEP 3108)
| Python 2 | Python 3 |
|---|---|
_winreg |
winreg |
ConfigParser |
configparser |
copy_reg |
copyreg |
Queue |
queue |
SocketServer |
socketserver |
__builtin__ |
builtins |
StringIO/cStringIO |
io.StringIO / io.BytesIO |
repr |
reprlib |
test.test_support |
test.support |
合并为包的模块
| 包 | 包含 |
|---|---|
dbm |
anydbm, dbhash, gdbm, whichdb, dumbdbm |
html |
HTMLParser, htmlentitydefs |
http |
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib |
tkinter |
所有 Tkinter 相关模块 |
urllib |
urllib, urllib2, urlparse, robotparse |
xmlrpc |
xmlrpclib, DocXMLRPCServer, SimpleXMLRPCServer |
移除的模块
gopherlib、md5(已被hashlib替代)、bsddb3sets(使用内置set())new模块socket.ssl()(改用ssl.wrap_socket())
五、异常体系重构
python
# 异常必须继承 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) |
python
# super() 无参调用(PEP 3135)
class Child(Parent):
def method(self):
super().method() # 无需传类名
七、其他核心变更
函数属性重命名(func_X → X)
python
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)
切片特殊方法废除
python
# __getslice__ / __setslice__ / __delslice__ 废除
# a[i:j] 现在统一调用 __getitem__(slice(i, j))
平台特定变更
python
# 文件名作为 Unicode 字符串传入
# 非 ASCII 标识符允许(PEP 3131)
def 问候(名字): # 合法
pass
# 默认源码编码:UTF-8(PEP 3120)
# -*- coding: utf-8 -*- # 可省略
StringIO/cStringIO 替换
python
# 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 不是一个普通的版本升级,而是一次语言设计理念的重新校准。它的核心原则:
- 消除 Unicode 混乱 --- str/bytes 严格分离,不再有隐式编码
- 去除历史包袱 --- exec、apply、callable、u"" 等遗留物全部清除
- 一致性 --- print 是函数,super() 无参调用,函数属性统一
__X__ - 显式优于隐式 --- 异常链、相对导入、关键字参数全部显式
- 视图而非列表 --- dict.keys() 返回视图,避免不必要的内存分配
Python 3.0 是 Python 走向成熟的标志。它的不兼容性是有意为之的,目的是让 Python 在下一个十年能够更干净、更安全、更现代化。迁移的痛苦是暂时的,收益是长期的。
参考:Python 3.0 官方文档 - What's New
内容由 AI 整理生成,内容仅供参考,请仔细甄别。