Python 3.6 新特性全面总结

Python 3.6 新特性全面总结

发布时间:2016 年 12 月 23 日

官方文档:https://docs.python.org/zh-cn/3.6/whatsnew/3.6.html


一、重磅新语法

1. f-strings 格式化字符串字面量(PEP 498)

最受欢迎的新特性之一,比 %.format() 更简洁高效:

python 复制代码
name = "Fred"
f"He said his name is {name}."  # 'He said his name is Fred.'

# 支持表达式和格式说明符
value = decimal.Decimal("12.34567")
f"result: {value:10.4f}"  # 'result:    12.3457'

# 嵌套字段
width = 10
precision = 4
f"result: {value:{width}.{precision}}"  # 'result:      12.35'

# 调用方法
f"{name.upper()}"  # 'FRED'

2. 数字字面量中的下划线(PEP 515)

提升大数字可读性:

python 复制代码
1_000_000_000          # 1000000000
0x_FF_FF_FF_FF         # 4294967295
1_000.000_001          # 1000.000001

# 格式化中的下划线分隔符
f'{1000000:,}'          # '1,000,000'
f'{0xFFFFFFFF:_x}'      # 'ffff_ffff'

3. 变量注解语法(PEP 526)

支持对变量进行类型注解(不仅限于函数参数):

python 复制代码
from typing import List, Dict

x: int = 10
primes: List[int] = []
captain: str  # 无初始值!

class Starship:
    stats: Dict[str, int] = {}
    name: str = "Enterprise"

4. 异步生成器(PEP 525)

python 复制代码
# 3.5:不能在同一个函数里同时使用 await 和 yield
# 3.6:解除限制,支持异步生成器
async def ticker(delay, to):
    for i in range(to):
        yield i
        await asyncio.sleep(delay)

async for i in async_range(1, 5):
    print(i)

5. 异步推导式(PEP 530)

python 复制代码
# async for 在推导式中
result = [i async for i in aiter() if i % 2]

# await 表达式在推导式中
result = [await fun() for fun in funcs if await condition()]

二、新增类定制协议(PEP 487)

__init_subclass__ --- 简化的类创建定制

无需元类即可定制子类创建:

python 复制代码
class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase): pass
class Plugin2(PluginBase): pass

__set_name__ --- 描述符协议增强

描述符现在能感知自身在类中的属性名:

python 复制代码
class IntField:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise ValueError(f'expecting integer in {self.name}')
        instance.__dict__[self.name] = value

    def __set_name__(self, owner, name):  # 新增!
        self.name = name

class Model:
    int_field = IntField()  # __set_name__ 自动被调用

三、路径协议(PEP 519)

os.PathLike 接口让所有标准库函数原生支持 pathlib.Path

python 复制代码
import pathlib

# open() 直接接受 Path 对象
with open(pathlib.Path("README")) as f:
    content = f.read()

# os.path 系列函数均支持
os.path.splitext(pathlib.Path("some_file.txt"))  # ('some_file', '.txt')
os.path.join("/a/b", pathlib.Path("c"))            # '/a/b/c'
os.fspath(pathlib.Path("file.txt"))              # 'file.txt'

四、字典实现重构

新实现使用紧凑表示,内存占用减少 20%-25%

python 复制代码
# 注意:此时顺序保证仍被视为实现细节
# 3.7 起正式成为语言规范的一部分

五、Windows 编码改进(PEP 528/529)

改进 说明
文件系统编码 → UTF-8 sys.getfilesystemencoding() 默认返回 'utf-8'
控制台编码 → UTF-8 sys.stdin/stdout/stderr 默认 UTF-8
长路径支持 python.exe 标记为 long-path aware,260 字符限制解除
bash 复制代码
# 恢复旧行为
PYTHONLEGACYWINDOWSFSENCODING=1
PYTHONLEGACYWINDOWSSTDIO=1

六、标准库新增模块

secrets --- 密码学安全随机数(PEP 506)

专为密码学安全随机数设计,替代 random 用于安全场景:

python 复制代码
import secrets

# 生成安全令牌
token = secrets.token_hex(16)    # 32 位十六进制字符串
token = secrets.token_urlsafe(32)  # URL 安全字符串

# 生成随机整数(指定范围)
code = secrets.randbelow(10000)  # 0-9999

# 比较安全字符串(防时序攻击)
secrets.compare_digest(a, b)

七、标准库重要改进

1. asyncio 稳定化

3.6 起 asyncio 不再是临时 API,成为正式稳定模块:

python 复制代码
# 新增功能
asyncio.run_coroutine_threadsafe(coro, loop)  # 从其他线程提交协程
loop.create_future()                           # 创建 Future
loop.get_exception_handler()                   # 获取异常处理器
loop.connect_accepted_socket()                  # 接受外部连接
loop.shutdown_asyncgens()                      # 关闭异步生成器

性能提升: Future 和 Task 的 C 实现使 asyncio 代码提速 30%

2. enum 枚举增强

python 复制代码
from enum import Enum, Flag, auto

# 位域枚举
class Perm(Flag):
    R = auto()
    W = auto()
    X = auto()

# 自动赋值
class Color(Enum):
    red = auto()   # 1
    blue = auto()  # 2
    green = auto()  # 3

3. hashlib 安全增强

python 复制代码
import hashlib

# BLAKE2
hashlib.blake2b(data)
hashlib.blake2s(data)

# SHA-3
hashlib.sha3_256(data)
hashlib.sha3_512(data)

# 密码学安全 KDF
hashlib.scrypt(password, salt=salt, n=16384, r=8, p=1)

4. datetime 时间歧义消除(PEP 495)

python 复制代码
from datetime import datetime, timezone, timedelta

Eastern = timezone(timedelta(hours=-5), 'EST')

for i in range(4):
    u = datetime(2016, 11, 6, 4 + i, tzinfo=timezone.utc)
    t = u.astimezone(Eastern)
    print(t.time(), t.tzname(), t.fold)
# 04:00 EDT 0
# 01:00 EDT 0
# 01:00 EST 1  ← fold=1 表示第二个(秋令时回拨)
# 02:00 EST 0

5. collections.abc 新增抽象基类

python 复制代码
from collections.abc import Collection, Reversible, AsyncGenerator

# Collection: 有长度的可迭代容器
# Reversible: 支持 __reversed__ 的可迭代对象
# AsyncGenerator: 异步生成器

6. cmath 新增常数(PEP 628)

python 复制代码
import cmath

cmath.tau   # τ = 2π
cmath.inf   # 正无穷(复数)
cmath.nan   # 非数字(复数)
cmath.infj  # 复数正无穷  (inf+0j)
cmath.nanj  # 复数 NaN   (nan+0j)

7. ModuleNotFoundError

python 复制代码
try:
    import something
except ModuleNotFoundError:  # ImportError 的子类
    ...

8. 其他改进

python 复制代码
# decimal 新方法
Decimal('-3.14').as_integer_ratio()  # (-157, 50)

# datetime 新参数
datetime.combine(date, time, tzinfo=tz)  # 支持 tzinfo
datetime.isoformat(timespec='milliseconds')  # 精度控制

# typing 反转 getfullargspec 废弃
# inspect.signature() 报告隐式参数 implicit0

# contextlib.AbstractContextManager
# tracemalloc 大幅改进(用于 ResourceWarning)
# email API 稳定化(EmailMessage)
# json 支持二进制输入

八、运行时与调试改进

1. PYTHONMALLOC 环境变量

bash 复制代码
# 调试模式:在释放内存中填充 0xDB,检测缓冲区溢出
python -X dev  # 或 PYTHONMALLOC=debug

# 强制使用系统 malloc
PYTHONMALLOC=malloc python app.py

2. DTrace 和 SystemTap 探测支持

bash 复制代码
./configure --with-dtrace
# 探测事件:函数调用/返回、GC 开始/结束、执行行号

3. 帧求值可插拔 API(PEP 523)

为 JIT 调试器提供 C 级别接口拦截帧求值。


九、其他值得关注的变化

语言层面

  • global/nonlocal 必须出现在首行(3.5 是 SyntaxWarning,3.6 提升为 SyntaxError)

  • 特殊方法可设为 None 表示操作不可用

    python 复制代码
    class NotIterable:
        __iter__ = None  # 此类不可迭代
  • 长 traceback 重复行缩写[Previous line repeated {count} more times]

顺序保证

场景 说明
类属性定义顺序 __dict__ 保留定义顺序
**kwargs 参数顺序 按传入顺序排列

Windows 改进

  • py.exe 交互模式默认选择 Python 3
  • ._pth 文件支持隔离模式
  • python36.zip 可作为 PYTHONHOME 地标

总结

Python 3.6 的核心亮点:

  1. f-strings --- 格式化字符串字面量,简洁优雅
  2. 数字下划线 --- 1_000_000 提升大数字可读性
  3. 变量注解语法 --- name: str = "foo" 类属性标注
  4. 异步生成器/推导式 --- async def 中可同时 yieldawait
  5. __init_subclass__ --- 无需元类定制子类创建
  6. __set_name__ --- 描述符感知自身属性名
  7. 路径协议(PathLike) --- 标准库函数原生支持 pathlib
  8. secrets 模块 --- 密码学安全随机数
  9. 字典内存优化 --- 紧凑表示减少 20-25% 内存
  10. Windows UTF-8 编码 --- 文件系统和控制台默认 UTF-8

Python 3.6 是一个语法体验大幅提升的版本。f-strings 彻底改变了字符串格式化的写法,变量注解语法让类型标注覆盖到所有变量级别,而异步生成器的引入则补完了 asyncio 生态的最后一块拼图。同时字典实现的内存优化和 Windows UTF-8 编码的改进也为后续版本奠定了坚实的基础。


参考:Python 3.6 官方文档 - What's New

内容由 AI 整理生成,内容仅供参考,请仔细甄别。

相关推荐
abcy0712131 小时前
flask celery hdfs 异步上传
python·hdfs·flask
2301_781833521 小时前
Python 正则表达式入门教程
开发语言·python·正则表达式
copyer_xyf2 小时前
Agent Tool 调用
后端·python·agent
Amo Xiang2 小时前
SpiderDemo 第5题:OB混淆实战 —— 反调试绕过与 signature 签名还原
python·js逆向·爬虫逆向·反调试·spiderdemo·ob混淆
copyer_xyf2 小时前
Agent 结构化输出
后端·python·agent
FBI HackerHarry浩2 小时前
Ollama如何安装到D盘
python·ai
DXM05213 小时前
第13期|遥感语义分割模型:U-Net核心原理+遥感落地优势
人工智能·python·深度学习·目标检测·随机森林·机器学习·支持向量机
码来的小朋友3 小时前
[python] 我开发了一个有20个关卡随机地图的迷宫游戏
python·游戏·pygame