一、Python3.6新特性
1、新的格式化字符串方式
新的格式化字符串方式,即在普通字符串前添加 f
或 F
前缀,其效果类似于str.format()
。比如
name = "red"
print(f"He said his name is {name}.")
# 'He said his name is red.'
相当于:
print("He said his name is {name}.".format(**locals()))
此外,此特性还支持嵌套字段,比如:
import decimal
width = 10
precision = 4
value = decimal.Decimal("12.34567")
print(f"result: {value:{width}.{precision}}")
#'result: 12.35'
2、变量声明语法
可以像下面一样声明一个变量并指定类型:
from typing import List, Dict
primes: List[int] = []
captain: str # 此时没有初始值
class Starship:
stats: Dict[str, int] = {}
3、数字的下划线写法
允许在数字中使用下划线,以提高多位数字的可读性。
a = 1_000_000_000_000_000 # 1000000000000000
b = 0x_FF_FF_FF_FF # 4294967295
除此之外,字符串格式化也支持_
选项,以打印出更易读的数字字符串:
'{:_}'.format(1000000) # '1_000_000'
'{:_x}'.format(0xFFFFFFFF) # 'ffff_ffff'
4、异步生成器
在Python3.5中,引入了新的语法 async 和 await 来实现协同程序。但是有个限制,不能在同一个函数体内同时使用 yield 和 await。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)
5、异步解析器
允许在列表list、集合set 和字典dict 解析器中使用 async 或 await 语法。
result = [i async for i in aiter() if i % 2]
result = [await fun() for fun in funcs if await condition()]
6、新增加模块
标准库(The Standard Library)中增加了一个新的模块:secrets
。该模块用来生成一些安全性更高的随机数,用于管理passwords, account authentication, security tokens, 以及related secrets等数据。
7、其他新特性
- 新的 PYTHONMALLOC 环境变量允许开发者设置内存分配器,以及注册debug钩子等。
- asyncio模块更加稳定、高效,并且不再是临时模块,其中的API也都是稳定版的了。
- typing模块也有了一定改进,并且不再是临时模块。
- datetime.strftime 和 date.strftime 开始支持ISO 8601的时间标识符%G, %u, %V。
- hashlib 和 ssl 模块开始支持OpenSSL1.1.0。
- hashlib模块开始支持新的hash算法,比如BLAKE2, SHA-3 和 SHAKE。
- Windows上的 filesystem 和 console 默认编码改为UTF-8。
- json模块中的 json.load() 和 json.loads() 函数开始支持 binary 类型输入。
更多内容参考官方文档:What's New In Python 3.6
二、Python3.7新特性
Python 3.7于2018年6月27日发布, 包含许多新特性和优化,增添了众多新的类,可用于数据处理、针对脚本编译和垃圾收集的优化以及更快的异步I/O,主要如下:
- 用类处理数据时减少样板代码的数据类。
- 一处可能无法向后兼容的变更涉及处理生成器中的异常。
- 面向解释器的“开发模式”。
- 具有纳秒分辨率的时间对象。
- 环境中默认使用UTF-8编码的UTF-8模式。
- 触发调试器的一个新的内置函数。
1、新增内置函数breakpoint()
使用该内置函数,相当于通过代码的方式设置了断点,会自动进入Pbd调试模式。
如果在环境变量中设置PYTHONBREAKPOINT=0
会忽略此函数。并且,pdb 只是众多可用调试器之一,你可以通过设置新的 PYTHONBREAKPOINT 环境变量来配置想要使用的调试器。
下面有一个简单例子,用户需要输入一个数字,判断它是否和目标数字一样:
"""猜数字游戏"""
def guess(target):
user_guess = input("请输入你猜的数 >>>