概览
Python3.6.0于2016年12月23日发布,与3.5版本相比,添加了以下新特性,详情请看python3.6发布日志。
新的语法特性:
- 格式化字符串字面值
- 数字字符串中支持下划线
- 变量注释的语法
- 异步生成器
- 异步列表推导
新的模块
添加了一个安全模块secrets到标准库中
CPython实现改进
- 字典基于Raymond Hettinger的建议使用更紧凑的表示重新实现了,和PyPy的字典实现类似。结果是和3.5版本相比,3.6版本字典的内存使用减少了20%到25%。
- 使用新的协议,自定义类的创建被简化了。
- 类属性的定义顺序能够被保存。
- 现在**kwargs中元素的顺序对应于传递给函数时的关键字参数的顺序。
- 添加了DTrace和SystemTap探测的支持。
- 新的PYTHONMALLOC环境变量可以用于调试解释器内存分配和访问错误。
重大的标准库改进
- asyncio模块接收了新特性,重大的可用性和性能改进,然后修复了大量的BUG。从Python 3.6开始asyncio模块不再是临时的了,它已经被认为是稳定的了。
- 新的文件系统路径协议已实现,用于支持路径类对象。所有标准库函数在处理路径时已使用新的协议。
- datetime模块在本地时间消除歧义上获得了支持。
- typing模块接受了一些改进。
- tracemalloc模块经过重大改造,现在可以为ResourceWarnning提供更好的输出,也为内存分配错误提供更好的诊断。
安全改进
- secrets模块已被添加,可以生成更安全的伪随机数。
- 在Linux上,os.urandom()现在会被锁住,直到系统的伪随机滴池被初始化增加安全。
- hashlib和ssl模块现在支持OpenSSL 1.1.0。
- hashlib模块现在支持BLAKE2、SHA-3和SHAKE摘要算法和scrypt()秘钥导出功能。
Windows改进
- Windows文件系统和控制台编码改为了UTF-8。
- python.exe和pythonw.exe现在支持长路径,详情请看removing the MAX_PATH limitation。
- 一个._pth文件可以被添加用于隔离模块,避免全路径搜索,详情请看文档。
Formatted字符串字面值
Formatted字符串是带有’f’字符前缀的字符串,可以很方便的格式化字符串。
>>> name = "xiaoming"
>>> f"He name is {name}"
'He name is xiaoming'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"
'result: 12.35'
数字中支持下划线
数字中支持使用下划线,方便阅读,例如:
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
字符串format方法也支持了’_’选项,当格式化为浮点数或整数时,以3位分隔,当格式化为’b’,’o’,’x’和’X’时,以4位分隔
>>> '{:_}'.format(10000000)
'10_000_000'
>>> '{:_b}'.format(10000000)
'1001_1000_1001_0110_1000_0000'
变量注释语法
变量注释没有给变量带来特殊的意义,只是为了方便IDE做类型检查。
>>> from typing import List,Dict
>>> primes: List[int] = []
>>> stats: Dict[str, int] = {}
上面代码中primes为变量名,List[int]为变量注释,用来说明primes列表是用来存放int类型数据的,但是这个不是强制性的,你使用append()方法添加一个str类型数据也是可以的,IDE会提示你添加的数据有误,但是运行时不会报错。
异步生成器
在Python3.5中,await和yield不能再同一个函数中使用,但是Python3.6已经取消了这个限制,可以在同一个函数体中使用了
async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)
异步列表推导
增加在list、set和dict的列表推导和生成表达式中使用async for。
如下面这段代码
result = []
async for i in aiter():
if i % 2:
result.append(i)
使用异步推导式之后,可以简写成
result = [i async for i in aiter() if i % 2]
现在也支持在所有的推导式中使用await表达式
result = [await fun() for fun in funcs]