Python常用新特性记录
- Python3.8
- PEP 572 :赋值表达式
- f-字符串支持 = 用于自动记录表达式和调试文档
- Python3.9
- PEP 584:字典合并与更新运算符
- PEP 616:新增用于移除前缀和后缀的字符串方法
- PEP 585:标准多项集中的类型标注泛型
- Python3.10
- PEP 604:新的类型联合运算符
- PEP 634:结构化模式匹配
Python3.8
PEP 572 :赋值表达式
新增的语法 := 可在表达式内部为变量赋值。 它被昵称为“海象运算符”因为它很像是 海象的眼睛和长牙。
在这个示例中,赋值表达式可以避免调用 len() 两次:
if (n := len(a)) > 10:print(f"List is too long ({n} elements, expected <= 10)")
类似的益处还可出现在正则表达式匹配中需要使用两次匹配对象的情况中,一次检测用于匹配是否发生,另一次用于提取子分组:
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):discount = float(mo.group(1)) / 100.0
此运算符也适用于配合 while 循环计算一个值来检测循环是否终止,而同一个值又在循环体中再次被使用的情况:
# Loop over fixed length blocks
while (block := f.read(256)) != '':process(block)
另一个值得介绍的用例出现于列表推导式中,在筛选条件中计算一个值,而同一个值又在表达式中需要被使用:
[clean_name.title() for name in namesif (clean_name := normalize('NFC', name)) in allowed_names]
请尽量将海象运算符的使用限制在清晰的场合中,以降低复杂性并提升可读性。
f-字符串支持 = 用于自动记录表达式和调试文档
>>>user = 'eric_idle'
>>>member_since = date(1975, 7, 31)
>>>f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
Python3.9
PEP 584:字典合并与更新运算符
合并 (|) 与更新 (|=) 运算符已被加入内置的 dict 类。 它们为现有的 dict.update 和 {**d1, **d2} 字典合并方法提供了补充。
示例:
>>>x = {"key1": "value1 from x", "key2": "value2 from x"}
>>>y = {"key2": "value2 from y", "key3": "value3 from y"}
>>>x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>>y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
PEP 616:新增用于移除前缀和后缀的字符串方法
增加了 str.removeprefix(prefix) 和 str.removesuffix(suffix) 用于方便地从字符串移除不需要的前缀或后缀。 也增加了 bytes, bytearray 以及 collections.UserString 的对应方法。
PEP 585:标准多项集中的类型标注泛型
在类型标注中现在你可以使用内置多项集类型例如 list 和 dict 作为通用类型而不必从 typing 导入对应的大写形式类型名 (例如 List 和 Dict)。 标准库中的其他一些类型现在同样也是通用的,例如 queue.Queue。
示例:
def greet_all(names: list[str]) -> None:for name in names:print("Hello", name)
Python3.10
PEP 604:新的类型联合运算符
引入了启用 X | Y 语法的类型联合运算符。 这提供了一种表示 ‘类型 X 或类型 Y’ 的相比使用 typing.Union 更清晰的方式,特别是在类型提示中。
在之前的 Python 版本中,要为可接受多种类型参数的函数应用类型提示,使用的是 typing.Union:
def square(number: Union[int, float]) -> Union[int, float]:return number ** 2
类型提示现在可以使用更简洁的写法:
def square(number: int | float) -> int | float:return number ** 2
这个新增语法也被接受作为 isinstance() 和 issubclass() 的第二个参数
>>>isinstance(1, int | str)
True
PEP 634:结构化模式匹配
增加了采用模式加上相应动作的 match 语句 和 case 语句 的形式的结构化模式匹配。 模式由序列、映射、基本数据类型以及类实例构成。 模式匹配使得程序能够从复杂的数据类型中提取信息、根据数据结构实现分支,并基于不同的数据形式应用特定的动作。
语法与操作
模式匹配的通用语法如下:
match subject:case <pattern_1>:<action_1>case <pattern_2>:<action_2>case <pattern_3>:<action_3>case _:<action_wildcard>