Python 3.0 新特性全面总结

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 复制代码
# 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

移除的模块

  • gopherlibmd5(已被 hashlib 替代)、bsddb3
  • sets(使用内置 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 不是一个普通的版本升级,而是一次语言设计理念的重新校准。它的核心原则:

  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 整理生成,内容仅供参考,请仔细甄别。

相关推荐
2401_882273721 小时前
如何在 CSS 中正确加载本地 JPG 背景图片
jvm·数据库·python
Lucas_coding2 小时前
【Claude Code Router】 Claude Code 兼容 OpenAI 格式 API, Claude code 接入本地部署模型
人工智能·python
测试员周周2 小时前
【AI测试系统】第5篇:从 Archon 看 AI 工程化落地:为什么"确定性编排+AI 弹性智能"是终局?
人工智能·python·测试
大飞记Python3 小时前
【2026更新】Python基础学习指南(AI版)——04数据类型
开发语言·人工智能·python
Hello eveybody4 小时前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp
2301_795099744 小时前
让 CSS Grid 自适应容器尺寸的动态布局方案
jvm·数据库·python
呆萌的代Ma4 小时前
python读取并加载.env的配置文件
python
Muyuan19984 小时前
27.RAG 系统中的上下文充分性判断:从 Chunk 数量、FAISS 距离到 LLM Relevance Gate
python·django·pdf·fastapi·faiss
U盘失踪了5 小时前
python curl转python脚本
开发语言·chrome·python