Python3.8 新特性

简介

Python3.8 发布于2019年10月14日,这儿总结一下改版本引入的一些新功能

官方新特性链接 Python3.8 新特性

安装

此处主要介绍在Ubuntu下安装 Python3.8

  1. 添加deadsnakes源
    • sudo add-apt-repository ppa:deadsnakes/ppa
    • sudo apt-get update
  2. 安装 Python3.8
    • sudo apt install python3.8-full
  3. 安装 Python3.8 的pip
    • python3.8 -m ensurepip --upgrade

海象运算符

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

例如以下代码可以避免 len() 调用两次

1
2
3
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")

利用海象表达式可以在一行内实现斐波那契数列

1
[(f:=(f[1], sum(f)) if i else (0,1))[1] for i in range(10)]

仅限位置形参

新增了一个函数形参语法 / 用来指明某些函数形参必须使用仅限位置而非关键字参数的形式

1
2
3
4
5
6
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)

# 形参 a 和 b 为仅限位置形参
# c 或 d 可以是位置形参或关键字形参,也就是默认形式
# e 或 f 要求为仅限关键字形参

字典可使用 reversed 进行反转

普通字典自 Python 3.7 起已保证具有确定的元素顺序,在 Python 3.8 中可以利用 reversed 按插入顺序反向迭代。

1
2
3
s={'a': 1,'b': 2,'c': 3}
print(list(reversed(s.items())))
# [('c', 3), ('b', 2), ('a', 1)]

f-string 增加 = 说明符

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

1
2
3
4
user = 'eric_idle'
member_since = date(1975, 7, 31)
f'{user=} {member_since=}'
# user='eric_idle' member_since=datetime.date(1975, 7, 31)

新版本还给 f-string 增加了转换符 !s 、!a 、!r
转换符 !s 是对结果调用 str(),!r 是调用 repr(),而 !a 是调用 ascii()。

1
2
3
4
5
import datetime
today = datetime.date.today()
print(f'今天是 {today!s}')
print(f'今天是 {today!r}')
print(f'今天是 {today!a}')

可从进程直接访问的共享内存

添加了新的 multiprocessing.shared_memory 模块,可以直接共享内存

1
2
3
from multiprocessing import shared_memory
a = shared_memory.ShareableList([2021, 'abc', 2022])
a
1
2
3
from multiprocessing import shared_memory
b = shared_memory.ShareableList(name=) #这里要把获得的name值写入
b

typing 特性

新增 TypeDict ,一个带有键专属类型的字典类型,TypedDict 只使用字符串作为键。 默认情况下每个键都要求提供。 指定 “total=False” 以允许键作为可选项

asyncio.run

asyncio.run() 已经从暂定状态晋级为稳定 API。 此函数可被用于执行一个 coroutine 并返回结果,同时自动管理事件循环。

1
2
3
4
5
6
7
import asyncio

async def main():
await asyncio.sleep(0)
return 42

asyncio.run(main())

其他特性

  • 之前版本中 continue 语句不允许在 finally 子句中使用,这是因为具体实现存在一个问题。 在 Python3.8 中此限制已被取消
  • 很多内置方法的性能都提高了 20% - 50%
  • typing.TypeDict