excelperfect 标签:Python 在Python的3.8版本中添加了赋值表达式,允许赋值给表达式中的变量。 其语法为: 名称 := 表达式 这个运算符被称为“海象运算符”,尽管它们的真实名称是“赋值表达式”。 下面是一些赋值表达式示例: # 处理匹配的正则表达式 if (match := pattern.search(data)) is not None: ...
# 对iter()调用的2-参数形式的更明确的替代方案 while (value := read_next_item()) is not None: ...
# 在解析筛选器子句及其输出之间共享子表达式 filtered_data = [y for x in data if (y := f(x)) is not None] 在这3个示例中,在表达式语句本身中创建变量。第一个示例通过为变量match赋值正则表达式模式搜索的结果来创建变量。第二个示例赋值变量value为while循环表达式中调用函数的结果。最后一个示例,将调用f(x)的结果赋给列表解析中的变量y。 下面,看看不使用赋值表达式和使用赋值表达式的代码之间的区别。 这是一个分块读取文件的示例:
这段代码将打开一个不确定大小的文件,每次处理1024字节。当处理非常大的文件时,这很有用,因为它阻止将整个文件加载到内存中。如果这样做,可能会耗尽内存,导致应用程序甚至计算机崩溃。 可以使用赋值表达式将这段代码缩短一点: with open(some_file) as file_obj: chunk_size = 1024 while data := file_obj.read(chunk_size): if 'something' in data: # 在这里以某种形式处理数据 这里,将read()的结果赋值给while循环表达式中的数据。这允许在while循环的代码块中使用该变量。它还检查是否返回了一些数据,因此不必使用if not data: break节。 PEP572中提到的另一个很好的例子来自Python自己的site.py,这是原始代码:
下面是通过使用赋值表达式来简化的代码: if env_base := os.environ.get('PYTHONUSERBASE', None): return env_base 将赋值移动到条件语句的表达式中,这将很好地缩短代码。 接下来,了解一些无法使用赋值表达式的情况。 有几种情况不能使用赋值表达式。赋值表达式最有趣的一个特点是,它们可以用于赋值语句不能使用的上下文,例如lambda或前面提到的解析。但是,它们不支持赋值语句可以做的某些事情。例如,不能执行多个目标赋值:
另一个被禁止的用例是在表达式语句的顶层使用赋值表达式。以下是PEP 572的示例: y := f(x) # 无效 (y := f(x)) # 有效, 但不推荐 PEP中有其他禁止或不鼓励赋值表达式的情况的详细列表。如果经常使用赋值表达式,则应参考该文档。 注:本文学习整理自www.blog.pythonlibrary.org,供参考。 |
|
来自: hercules028 > 《Python and AI》