Python 3.9 新特性全面总结

📅 2026/7/5 15:27:57
Python 3.9 新特性全面总结
Python 3.9 新特性全面总结发布时间2020 年 10 月 5 日官方文档https://docs.python.org/zh-cn/3.9/whatsnew/3.9.html一、重磅新语法1. 字典合并运算符|和|PEP 584终于不用再写{**d1, **d2}了x{a:1,b:2}y{b:99,c:3}# 合并新建字典右侧优先zx|y# {a: 1, b: 99, c: 3}# 原地更新类似 dict.updatex|y# x 变为 {a: 1, b: 99, c: 3}注意|不修改原字典|会修改左侧字典。2. 内置类型直接用于类型标注PEP 585以前写类型提示必须从typing导入List、Dict等大写版本现在可以直接用内置类型# 旧写法3.8 及以前fromtypingimportList,Dict,Tupledeffoo(names:List[str])-Dict[str,int]:...# 新写法3.9deffoo(names:list[str])-dict[str,int]:...支持的类型包括list、dict、tuple、set、frozenset以及queue.Queue等标准库类型。3. 字符串新增removeprefix/removesuffixPEP 616告别lstrip的误用精准移除前缀/后缀Hello, World!.removeprefix(Hello, )# World!Hello, World!.removesuffix(, World!)# Hello# 如果前/后缀不存在原样返回Python.removeprefix(Java)# Pythonbytes、bytearray、collections.UserString同样支持。4. 装饰器语法放宽PEP 614之前装饰器只能是简单的名称或属性访问现在任意合法表达式都可以作为装饰器# 现在合法了button_list[0].clicked.connectbutton_list[0].clicked.connectdefslot():...二、新增模块1.zoneinfo— 时区支持PEP 615标准库终于内置了 IANA 时区数据库支持不再需要第三方pytzfromzoneinfoimportZoneInfofromdatetimeimportdatetime dtdatetime(2024,6,1,12,tzinfoZoneInfo(Asia/Shanghai))print(dt)# 2024-06-01 12:00:0008:00在没有系统时区数据的平台如 Windows可通过pip install tzdata安装数据包。2.graphlib— 拓扑排序新增graphlib.TopologicalSorter用于有向无环图的拓扑排序适合任务依赖调度等场景fromgraphlibimportTopologicalSorter graph{D:{B,C},C:{A},B:{A}}tsTopologicalSorter(graph)print(list(ts.static_order()))# [A, C, B, D] 或类似顺序三、标准库改进常用部分math模块增强importmath math.gcd(12,18,24)# 支持多个参数了返回 6math.lcm(4,6,10)# 新增最小公倍数返回 60math.nextafter(1.0,2.0)# 新增返回 1.0 往 2.0 方向的下一个浮点数math.ulp(1.0)# 新增返回浮点数的最小精度单位asyncio改进新增asyncio.to_thread()将同步阻塞函数放到线程池执行避免阻塞事件循环importasynciodefblocking_io():# 模拟耗时 IO...asyncdefmain():awaitasyncio.to_thread(blocking_io)asyncio.wait_for()超时取消行为更可靠移除了asyncio.Task.current_task()和asyncio.Task.all_tasks()已在 3.7 弃用请用asyncio.current_task()和asyncio.all_tasks()typing模块新增typing.Annotated可以为类型附加额外元数据如校验规则、文档说明等fromtypingimportAnnotated# 附加元数据不影响运行时类型检查供框架如 FastAPI使用PositiveAnnotated[int,must be positive]random模块新增random.randbytes(n)生成 n 个随机字节importrandom random.randbytes(8)# b\x9f\x12...pathlib模块新增Path.readlink()读取符号链接目标路径等价于os.readlink()。concurrent.futures改进Executor.shutdown()新增cancel_futuresTrue参数可立即取消所有未开始的任务不必等待它们完成。ipaddress模块支持 IPv6 作用域地址%scope_id格式注意3.9.5不再接受 IPv4 地址中带前缀零的写法如010.0.0.1避免八进制歧义四、解释器与性能优化新 PEG 解析器PEP 617CPython 从 LL(1) 解析器切换到基于PEG的新解析器性能相当但为未来新语法特性提供更大灵活性。Python 3.10 起旧解析器被彻底移除。内置类型 vectorcall 加速range、tuple、set、frozenset、list、dict等内置类型通过 PEP 590 vectorcall 协议加速函数调用开销更低。其他优化多线程信号处理优化非主线程不再每条字节码都检查信号减少不必要的中断UTF-8 / ASCII 短字符串解码速度提升约15%ProcessPoolExecutor工作进程按需创建减少空闲进程的 CPU 浪费垃圾回收不再因复活对象而阻塞其他不可达对象的回收五、弃用警告需要注意弃用内容说明替代方案collections.Mapping等别名Python 3.9 是最后支持版本3.10 移除改用collections.abc.Mapping等parser和symbol模块随旧解析器一起弃用改用ast模块math.factorial(float)不再接受浮点数参数传入整数asyncio.wait()传入协程对象将在 3.11 移除改传 Task 或 Futurerandom.shuffle(x, random...)random参数弃用直接调用random.shuffle(x)lib2to3模块发出 PendingDeprecationWarning考虑 LibCST 或 parsoGzipFile写入不指定mode未来默认改为读取显式传入modewb六、正式移除升级必看这些 API 在 3.9 中已彻底删除升级时需检查代码移除内容替代方案array.tostring()/fromstring()tobytes()/frombytes()threading.Thread.isAlive()is_alive()base64.encodestring()/decodestring()encodebytes()/decodebytes()fractions.gcd()math.gcd()json.loads(encoding...)直接传字符串无需指定编码asyncio.Task.current_task()/all_tasks()asyncio.current_task()/asyncio.all_tasks()ElementTree.getchildren()/getiterator()list(x)/x.iter()sys.getcheckinterval()/setcheckinterval()sys.getswitchinterval()/setswitchinterval()_dummy_thread/dummy_threading模块已无替代直接移除with (await asyncio.lock):语法async with lock:七、其他值得关注的小变化__main__.__file__改为绝对路径python3 script.py时__file__不再是相对路径os.chdir()后仍然有效sys.stderr改为行缓冲非交互模式下 stderr 不再是块缓冲日志输出更及时datetime.isocalendar()返回 namedtuple可以用.year、.week、.weekday访问字段logging.getLogger(root)行为变化现在返回真正的根日志器而非名为root的普通日志器Unicode 数据库升级到 13.0总结Python 3.9 的核心亮点|字典合并运算符— 最受欢迎的语法糖之一内置类型直接用于类型标注— 告别from typing import Liststr.removeprefix/removesuffix— 简洁实用zoneinfo时区模块— 标准库终于有了靠谱的时区支持PEG 解析器— 为未来语法扩展铺路同时这也是Python 2 兼容层的最后一个版本collections.Mapping等别名将在 3.10 彻底消失建议尽早迁移。参考Python 3.9 官方文档 - What’s New内容由 AI 整理生成内容仅供参考请仔细甄别。