python3新增特性总结(3.5,3.6,3.7,3.8,3.9)

import asyncio
import numpy
import decimal
import re
import datetime
from math import radians, cos
import nest_asyncio
nest_asyncio.apply()

1.python 3.5的新增特性

01. 标准库中的改进

  • 新的subprogress.run() 方法

02. 新的语法特性

001.使用async await语法实现协程(coroutine)

如下

async def hello():
    print('hello')
await hello()

async for 可以遍历你写的异步操作的迭代器
下面是官方给出的例子, 不过不知道为什么在python3.8 jupyter notebook下不能正常执行,难道api已经弃用了?
就我去查了以下发现, "RuntimeError: This event loop is already running",这个错误其实是因为asyncio不允许事件循环的嵌套。jupyter本身的web后台已经运行了一个事件循环,所以你不能用get_event_loop开启一个新循环了。
所以我导入了一个nest-asyncio包,是这个问题的一个解决方案,之后就可以用了。

async def http_get(domain):
    reader, writer = await asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Connection: close',
        b'', b''
    ]))

    async for line in reader:
        print('>>>', line)

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('www.baidu.com'))
finally:
    print('finish')
#     loop.close()

async with 实现异步的上下文管理器,比如异步锁
async with lock
官方给的例子同样无法执行,太蠢了

async def coro(name, lock):
    print('coro {}: waiting for lock'.format(name))
    async with lock:
        print('coro {}: holding the lock'.format(name))
        await asyncio.sleep(1)
        print('coro {}: releasing the lock'.format(name))

loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
    loop.run_until_complete(coros)
finally:
    print('finally')
#     loop.close()

002.矩阵乘法专用的运算符@

x = numpy.ones(3)
m = numpy.eye(3)
print('x:', x)
print('m:', m)
x@m

003.新的解包操作符,可以解构字典和列表

其中*解构列表,**解构字典

print(*[1], *[2], 3, *[4, 5])


def fn(a, b, c, d):
    print(a, b, c, d)


fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})

也可以解构元祖,集合set等

*range(4), 4
[*range(4), 4]
{*range(4), 4, *(5, 6, 7)}
{'x': 1, **{'y': 2}}

03.新的库模块

  • typing 类型提示
  • zipapp 改进Python ZIP应用程序支持.

2.python 3.6的新增特性

01.新的语法特性

001.格式化字符串 PEP498

就类似于js的模板字符串,括号内的变量会在运行时求值,并且用format()进行格式化

name = 'zhangsan'
f'he said his name is {name}'
# 格式化的宽度
width = 10
# 精度,结果长度是4位
precision = 4
# decmials是进行十进制浮点数运算的模块,基于人类习惯的浮点数模型,具有精确性,比如0.1+0.1+0.1-0.3=0
value = decimal.Decimal("12.34567")
f"result: {value:{width}.{precision}}"

002.变量注释的语法 PEP526

这个语法的使用需要一些工具支持,比如pycharm

primes: list[int] = []

captain: str  # Note: no initial value!


class Starship:
    stats: dict[str, int] = {}


primes.append('sda')
print(primes)

003.数字中可以使用下划线增强可读性 PEP515

print(1_000_000_000_000_00)
print(0x_FF_FF_FF_FF)

字符串格式化也支持下划线_选项

'{:_}'.format(1000000)
'{:_x}'.format(0xFFFFFFFF)

004.异步生成器 PEP525

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)
# tickers =  ticker(50,100)
async for i in ticker(1, 3):
    print(i)

005.异步推导 PEP530

增加了对列表,集合和字典推导式和生成表达式中对async for的支持
await表达式也在所有种类的推导式得到了支持

result = [i async for i in aiter() if i % 2]

result = [await fun() for fun in funcs if await condition()]

006.增加文件系统路径协议 PEP519

文件路径历来都是用bytes和str来表示
大家都认定路径是这两种类型之一,问题在于阻止了路径的对象表示的库pathlib和其他库之间的使用。

定义了os.PakLick的接口,并且内置的open和os的其他模块也更新了。
这个设计使得其他第三方代码以比较少的修改,兼容pathlike对象

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

007.windows系统中 文件编码和控制台编码更改为UTF-8

3.python 3.7的新增特性

01.新增的语法特性

001.延迟的标注求值(一看就知道是用不到的语法)

002.async和await成为保留关键字

02.数据模型的改进

dict 对象会保持插入时的顺序这个特性 正式宣布 成为 Python 语言官方规范的一部分。

03.标准库中的改进

time 模块现在提供 纳秒级精度函数 的支持。

4.python 3.8的新增特性

01. 新增语法特性

001.赋值表达式 PEP572
新增的语法 := 可在表达式内部为变量赋值。 它被昵称为“海象运算符”因为它很像是 海象的眼睛和长牙。

下面这个例子,避免了调用len两次的情况。
你在if里不进行赋值,直接用len(a),那么你到格式化字符串的时候还要再用一次len()计算,
这种情况我们可能会再if外先定义一个len的变量,但是这个新特性的写法显然会更简洁一些,提升可读性

a = '1234567890123'
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

类似的,下面这个正则表达式的例子

advertisement = r'80% discount '
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0
    print(discount)


此运算符也适用于配合 while 循环计算一个值来检测循环是否终止,而同一个值又在循环体中再次被使用的情况:

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

另一个值得介绍的用例出现于列表推导式中,在筛选条件中计算一个值,而同一个值又在表达式中需要被使用:

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

002.仅限位置形参 PEP570

函数参数用/,指明某些函数形参必须使用仅限位置而非关键字参数的形式

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

以下均为合法的调用:

f(10, 20, 30, d=40, e=50, f=60)

但是,以下均为不合法的调用:

f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument

003.f字符串支持用=,自动记录表达式和调试文档

增加 = 说明符用于 f-string。 形式为 f'{expr=}' 的 f-字符串将扩展表示为表达式文本,加一个等于号,再加表达式的求值结果。

user = 'eric_idle'
member_since = datetime.date(1975, 7, 31)
f'{user=} {member_since=}'

通常的 f-字符串格式说明符 允许更细致地控制所要显示的表达式结果:

delta = datetime.date.today() - member_since
f'{user=!s}  {delta.days=:,d}'

= 说明符将输出整个表达式,以便详细演示计算过程:

theta = 30
print(f'{theta=}  {cos(radians(theta))=:.3f}')

5.python 3.9新增特性

01. 新增的语法特性

001. dict增加合并运算符

合并 (|) 与更新 (|=) 运算符已被加入内置的 dict 类。 它们为现有的 dict.update{**d1, **d2} 字典合并方法提供了补充。

x = {"key1": "value1 from x", "key2": "value2 from x"}
y = {"key2": "value2 from y", "key3": "value3 from y"}
print(x | y)
print(y | x)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容