Python从3.7开始各版本新增特性和示例
1. Python 3.7 新特性
1.1 PEP 563: 延迟的标注求值
Python 3.7 引入了 PEP 563,这允许类型注解的延迟求值,解决了类型提示中的两个主要问题:启动性能和前向引用。通过延迟求值,类型注解在定义时不会被立即计算,而是在需要时才解析,从而提升了程序启动性能。此外,这使得开发者可以使用前向引用,即在类定义中引用尚未定义的类型。
1.2 PEP 538: 传统 C 区域强制转换
PEP 538 更新了 Python 解释器的默认命令行接口,以自动将传统的 C 区域强制转换为基于 UTF-8 的区域。这意味着核心解释器和能感知区域的 C 扩展都将假定 UTF-8 作为默认的文本编码,而不是 ASCII。这一改变提高了 Python 在国际化环境中的文本处理能力。
1.3 PEP 540: 强制 UTF-8 运行时模式
Python 3.7 新增了 -X utf8
命令行选项和 PYTHONUTF8
环境变量,用于启用 CPython 的 UTF-8 模式。在此模式下,CPython 忽略区域设置,默认使用 UTF-8 编码,这简化了在不同系统上的文本处理。
1.4 PEP 553: 内置的 breakpoint()
Python 3.7 包含了新的内置 breakpoint()
函数,提供了一种简单方便地进入 Python 调试器的方式。这个函数会调用 sys.breakpointhook()
,在默认情况下会导入 pdb
并调用 pdb.set_trace()
,允许开发者在代码中快速设置断点进行调试。通过设置 PYTHONBREAKPOINT
环境变量,可以配置使用的调试器或禁用 breakpoint()
函数。
2. Python 3.8 新特性
2.1 Walrus运算符 (:=
)
Python 3.8 引入了 Walrus 运算符(:=
),这是一个赋值表达式,允许在表达式内部进行变量赋值。这个特性极大地简化了某些类型的代码,特别是那些需要从复杂表达式中提取结果并将其用于后续逻辑的情况。
例如,在使用 while
循环时,通常需要获取某个资源并检查其状态,然后决定是否继续循环。在没有 Walrus 运算符的情况下,这可能需要多行代码来实现。现在,可以简化为一行代码:
while (line := (yield from stream.readline())):
if终止条件(line):
break
2.2 f-strings改进
Python 3.8 对 f-strings 进行了改进,使得在格式化字符串字面值中可以使用等号和括号。这意味着开发者可以在 f-string 中直接进行表达式计算和变量替换,而不需要额外的括号来包裹表达式。
改进之前的 f-string 需要使用额外的括号来确保表达式的计算顺序,如下所示:
name = "Alice"
age = 30
# 需要额外的括号来保证计算顺序
print("{name}'s age is {(age + 5)} years old".format(name=name, age=age))
改进之后,可以直接在 f-string 中使用表达式,无需额外括号:
name = "Alice"
age = 30
print(f"{name}'s age is {age + 5} years old")
2.3 异步迭代器和异步生成器改进
Python 3.8 对异步迭代器和异步生成器进行了改进,使得编写和使用异步迭代器和生成器变得更加简洁和直观。
在 Python 3.7 中,异步迭代器需要定义一个 _anext()
方法,而在 Python 3.8 中,可以直接使用 async for
循环来消费异步迭代器,无需显式调用 _anext()
方法。这使得异步迭代器的使用更加方便。
此外,Python 3.8 引入了 asyncio.run()
函数,这是一个高级接口,用于执行顶层的异步代码。这使得从同步代码中启动异步程序变得更加简单。
例如,使用 asyncio.run()
启动一个异步程序:
import asyncio
async def main():
# 异步操作
print("Hello, world!")
asyncio.run(main())
这些改进使得 Python 的异步编程更加易用和强大,为开发者提供了更好的工具来编写高效的异步代码。
3. Python 3.9 新特性
3.1 字典合并运算符 (|
)
Python 3.9 引入了字典合并运算符 |
,它允许开发者使用简洁的语法来合并两个字典。这个特性特别适用于组合来自不同数据源的字典,例如配置文件的合并。
# 合并两个字典
config = {"host": "localhost", "port": 8080}
defaults = {"port": 80, "timeout": 30}
combined_config = config | defaults
print(combined_config) # 输出:{'host': 'localhost', 'port': 8080, 'timeout': 30}
在这个例子中,combined_config
包含了 config
和 defaults
中的所有键值对,如果有相同的键,则 config
中的值会覆盖 defaults
中的值。
3.2 类型提示改进
Python 3.9 对类型提示进行了改进,支持更多的类型注解语法和类型推断。这包括对 typing
模块的更新,以及对内置集合类型的类型提示支持。
from typing import TypedDict, List
# 使用 TypedDict 定义字典结构
class User(TypedDict):
name: str
age: int
# 列表的类型提示
users: List[User] = [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25},
]
# 现在可以更准确地标注函数返回值的类型
def get_users() -> List[User]:
return users
这些改进使得类型提示更加灵活和强大,有助于开发者编写更清晰和可维护的代码。
3.3 新标准库模块
Python 3.9 引入了一些新的标准库模块,其中包括 zoneinfo
模块用于处理时区信息,以及 graphlib
模块用于处理图形数据结构。
zoneinfo
模块提供了对 IANA 时区数据库的支持,允许开发者在处理日期和时间时考虑时区。
from zoneinfo import ZoneInfo
# 创建时区对象
tz = ZoneInfo("America/New_York")
from datetime import datetime, timedelta
# 考虑时区的日期和时间
dt = datetime(2023, 1, 1, 12, 0, tzinfo=tz)
print(dt) # 输出考虑时区的日期和时间
graphlib
模块提供了图数据结构和算法,使得处理图相关的问题变得更加方便。
from graphlib import TopologicalSorter
# 创建图并添加节点和依赖关系
ts = TopologicalSorter()
ts.add('A', 'B') # A 依赖于 B
ts.add('B', 'C') # B 依赖于 C
ts.add('A', 'C') # A 也依赖于 C
# 执行拓扑排序
for node in ts.static_order():
print(node)
这些新模块的加入,进一步扩展了 Python 标准库的功能,为特定领域的编程提供了更多的便利。
4. Python 3.10 新特性
4.1 匹配模式(match statement)
Python 3.10 引入了一种新的结构——匹配模式(match statement),这是一种类似于其他编程语言中的模式匹配或 switch-case 语句的特性。它允许开发者基于不同的情况来执行不同的代码块。
def greet(name):
match name:
case "Alice":
return "Hello, Alice!"
case "Bob":
return "Hello, Bob!"
case _:
return "Hello, stranger!"
在这个例子中,match
语句检查 name
的值,并根据其与 case
子句的匹配情况来选择执行的代码块。如果没有任何 case
子句匹配成功,那么执行带有 _
(表示默认情况)的代码块。
4.2 结构化的异常上下文
Python 3.10 对异常处理进行了改进,引入了结构化的异常上下文,使得异常信息更加丰富和有用。现在,异常对象包含更多的属性,比如 .__cause__
和 .__context__
,这些属性提供了异常链的详细信息。
try:
# 尝试执行可能引发异常的操作
risky_operation()
except Exception as e:
# 打印异常的上下文信息
print(f"An error occurred: {e}")
print(f"Caused by: {e.__cause__}")
print(f"Context: {e.__context__}")
在这个例子中,如果 risky_operation()
引发异常,异常对象 e
会包含关于异常原因和上下文的详细信息,这有助于开发者更好地理解异常发生的环境和原因。
4.3 zoneinfo模块改进
Python 3.10 对 zoneinfo
模块进行了改进,使其更加易用和强大。现在,zoneinfo
模块提供了更简单的方式来创建时区对象,并且可以直接使用时区名称作为参数。
from zoneinfo import ZoneInfo
# 直接使用时区名称创建时区对象
tz = ZoneInfo("America/New_York")
# 使用时区对象处理时间
dt = datetime(2023, 1, 1, 12, 0, tzinfo=tz)
print(dt) # 输出考虑时区的日期和时间
此外,zoneinfo
模块现在支持从操作系统的时区数据库加载时区信息,这意味着开发者可以更容易地获取和使用最新的时区数据。这些改进使得 zoneinfo
模块成为处理时区相关问题的首选工具。
5. 示例代码
5.1 Python 3.7 类型标注示例
Python 3.7 引入了对类型标注的改进,使得代码更加清晰和易于维护。以下是使用类型标注的示例:
from typing import List
def greet(names: List[str]) -> None:
for name in names:
print(f"Hello, {name}!")
# 使用类型标注的函数
greet(["Alice", "Bob", "Charlie"])
5.2 Python 3.8 Walrus运算符示例
Walrus 运算符 (:=
) 允许在表达式内部进行变量赋值,这使得某些代码更加简洁。以下是 Walrus 运算符的示例:
def find_first_even(numbers):
for number in numbers:
if (even := number % 2 == 0):
return number
return None
# 使用 Walrus 运算符简化 if 语句
print(find_first_even([1, 3, 5, 8]))
5.3 Python 3.9 字典合并运算符示例
字典合并运算符 |
使得合并字典变得非常简单。以下是使用字典合并运算符的示例:
# 使用字典合并运算符合并字典
personal_info = {"name": "Alice", "age": 30}
contact_info = {"email": "alice@example.com", "phone": "123-456-7890"}
full_info = personal_info | contact_info
print(full_info)
5.4 Python 3.10 匹配模式示例
匹配模式(match statement)提供了一种新的方式来执行基于模式的代码分支。以下是使用匹配模式的示例:
def get_greeting(name: str) -> str:
match name.lower():
case "alice":
return "Hello, Alice!"
case "bob":
return "Hello, Bob!"
case _:
return "Hello, there!"
# 使用匹配模式根据不同的名字返回不同的问候语
print(get_greeting("Alice"))
print(get_greeting("Bob"))
print(get_greeting("Charlie"))
6. 总结
Python自3.7版本以来,引入了一系列新特性,这些特性不仅提升了语言的表达能力,也增强了性能和易用性。从类型注解的改进、字符串格式化的增强,到异步编程的简化,再到模式匹配的引入,Python持续在为开发者提供更加强大和灵活的工具。
6.1 类型系统和性能的提升
类型注解的增强,包括延迟求值和更丰富的类型提示,使得Python代码的可读性和可维护性得到了显著提升。同时,通过改进类型系统的实现,提高了程序的启动性能。
6.2 国际化和本地化的支持
通过PEP 538和PEP 540,Python加强了对国际化和本地化的支持,使得Python程序能够更好地处理多语言文本,简化了在不同区域设置下的文本处理。
6.3 异步编程的进步
Python 3.8和3.9版本对异步迭代器和生成器的改进,以及asyncio.run()
的引入,使得Python在异步编程领域更加成熟,为编写高效的异步代码提供了更好的支持。
6.4 语言结构的增强
Walrus运算符的引入,以及字典合并运算符的出现,进一步丰富了Python的语言结构,使得某些类型的代码编写变得更加简洁和直观。
6.5 模式匹配的引入
Python 3.10版本引入的匹配模式,为Python增添了一种新的代码分支结构,使得基于数据的代码执行更加灵活和强大。
6.6 新标准库模块的加入
新加入的zoneinfo
和graphlib
模块,扩展了Python标准库的功能,为处理时区和图数据结构提供了原生支持。
这些新特性的引入,不仅反映了Python社区对语言发展的持续贡献,也显示了Python作为一种现代编程语言,其活跃的生态系统和强大的生命力。随着Python的不断进步,我们可以期待它在未来的软件开发中扮演更加重要的角色。