Python 3.6 新特性全面解析

 更新时间:2026年06月15日 09:10:22   作者:@风之所往  
Python 3.6 是在 2016 年 12 月发布的,它引入了许多新特性,旨在提高性能、易用性和功能性,本文介绍Python 3.6 新特性全面总结,感兴趣的朋友跟随小编一起看看吧

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

一、重磅新语法

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

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

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)

提升大数字可读性:

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)

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

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)

# 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)

# 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__— 简化的类创建定制

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

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__— 描述符协议增强

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

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

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%

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

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

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

六、标准库新增模块

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

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

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,成为正式稳定模块:

# 新增功能
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枚举增强

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安全增强

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)

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新增抽象基类

from collections.abc import Collection, Reversible, AsyncGenerator
# Collection: 有长度的可迭代容器
# Reversible: 支持 __reversed__ 的可迭代对象
# AsyncGenerator: 异步生成器

6.cmath新增常数(PEP 628)

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

7.ModuleNotFoundError

try:
    import something
except ModuleNotFoundError:  # ImportError 的子类
    ...

8. 其他改进

# 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环境变量

# 调试模式:在释放内存中填充 0xDB,检测缓冲区溢出
python -X dev  # 或 PYTHONMALLOC=debug
# 强制使用系统 malloc
PYTHONMALLOC=malloc python app.py

2. DTrace 和 SystemTap 探测支持

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

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

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

九、其他值得关注的变化

语言层面

  • global/nonlocal 必须出现在首行(3.5 是 SyntaxWarning,3.6 提升为 SyntaxError)
  • 特殊方法可设为 None 表示操作不可用
    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

到此这篇关于Python 3.6 新特性全面解析的文章就介绍到这了,更多相关Python 3.6 新特性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现写数字文件名的递增保存文件方法

    python实现写数字文件名的递增保存文件方法

    今天小编就为大家分享一篇python实现写数字文件名的递增保存文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • matplotlib subplots 调整子图间矩的实例

    matplotlib subplots 调整子图间矩的实例

    今天小编就为大家分享一篇matplotlib subplots 调整子图间矩的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python中按指定数量分割列表字符串的两种方法

    Python中按指定数量分割列表字符串的两种方法

    处理列表数据时,有时我们需要将一个包含长字符串的列表分割成按照特定长度的小字符串的多个列表,本文主要介绍了Python中按指定数量分割列表字符串,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • python实现字母闪烁效果的示例代码

    python实现字母闪烁效果的示例代码

    本文主要介绍了python实现字母闪烁效果的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python下读取公私钥做加解密实例详解

    python下读取公私钥做加解密实例详解

    这篇文章主要介绍了python下读取公私钥做加解密实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • Python利用Charles 实现全部自动答题思路流程分析

    Python利用Charles 实现全部自动答题思路流程分析

    这篇文章主要介绍了Python利用Charles 实现全部自动答题思路流程分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python强化练习之Tensorflow2 opp算法实现月球登陆器

    Python强化练习之Tensorflow2 opp算法实现月球登陆器

    在面向对象出现之前,我们采用的开发方法都是面向过程的编程(OPP)。面向过程的编程中最常用的一个分析方法是“功能分解”。我们会把用户需求先分解成模块,然后把模块分解成大的功能,再把大的功能分解成小的功能,整个需求就是按照这样的方式,最终分解成一个一个的函数
    2021-10-10
  • 在Django中URL正则表达式匹配的方法

    在Django中URL正则表达式匹配的方法

    今天小编就为大家分享一篇在Django中URL正则表达式匹配的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • PyCharm搭建Spark开发环境的实现步骤

    PyCharm搭建Spark开发环境的实现步骤

    这篇文章主要介绍了PyCharm搭建Spark开发环境的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Python opencv实现人眼/人脸识别以及实时打码处理

    Python opencv实现人眼/人脸识别以及实时打码处理

    这篇文章主要为大家详细介绍了Python opencv实现人眼、人脸识别,以及实时打码处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论