分享

Python基础:赋值表达式的应用

 hercules028 2023-02-11 发布于广东

excelperfect

标签:Python

Python3.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赋值正则表达式模式搜索的结果来创建变量。第二个示例赋值变量valuewhile循环表达式中调用函数的结果。最后一个示例,将调用f(x)的结果赋给列表解析中的变量y

下面,看看不使用赋值表达式和使用赋值表达式的代码之间的区别。

这是一个分块读取文件的示例:

with open(some_file) as file_obj: while True:   chunk_size = 1024   data = file_obj.read(chunk_size)   if not data:     break   if 'something' in data:      # 在这里以某种形式处理数据

这段代码将打开一个不确定大小的文件,每次处理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,这是原始代码:

env_base = os.environ.get('PYTHONUSERBASE', None)if env_base: return env_base

下面是通过使用赋值表达式来简化的代码:

if env_base := os.environ.get('PYTHONUSERBASE', None): return env_base

将赋值移动到条件语句的表达式中,这将很好地缩短代码。

接下来,了解一些无法使用赋值表达式的情况。

有几种情况不能使用赋值表达式。赋值表达式最有趣的一个特点是,它们可以用于赋值语句不能使用的上下文,例如lambda或前面提到的解析。但是,它们不支持赋值语句可以做的某些事情。例如,不能执行多个目标赋值:

x = y = z = 0 #等效,但不工作:(x:=(y:=(z:=0)))

另一个被禁止的用例是在表达式语句的顶层使用赋值表达式。以下是PEP 572的示例:

y := f(x) # 无效(y := f(x)) # 有效, 但不推荐

PEP中有其他禁止或不鼓励赋值表达式的情况的详细列表。如果经常使用赋值表达式,则应参考该文档。

注:本文学习整理自www.blog.pythonlibrary.org,供参考。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多