如何在 Python 中使用赋值表达式

作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。

介绍

Python 3.8,于2019年10月发布,通过:=语法将任务表达式添加到Python中。

任命表达式允许在较大的表达式中发生变量任命,而任命表达式从来不严格需要写正确的Python代码,但它们可以帮助使现有的Python代码更简洁。

在本教程中,您将在几个例子中使用分配表达式来生成简要的代码部分。

前提条件

为了充分利用本教程,您将需要:

如果语句中使用分配表达式

让我们从一个例子开始,看看如何在如果语句中使用分配表达式。

考虑下面的代码,检查一个 列表的长度,并打印一个陈述:

1some_list = [1, 2, 3]
2if (list_length := len(some_list)) > 2:
3    print("List length of", list_length, "is too long")

如果您运行以前的代码,您将收到以下输出:

1[secondary_label Output]
2List length of 3 is too long

你将名为some_list的列表初始化,该列表包含三个元素,然后if语句使用(list_length := len(some_list))的分配表达式,将名为list_length的变量绑定到some_list的长度。

<$>[注] **注:**任务表达式是Python 3.8(https://docs.python.org/3/whatsnew/3.8.html)中引入的新功能。要运行本教程中的示例,您需要使用Python 3.8或更高版本。

如果我们没有使用任务表达式,我们的代码可能会稍长一些,例如:

1some_list = [1, 2, 3]
2list_length = len(some_list)
3if list_length > 2:
4    print("List length of", list_length, "is too long")

此代码样本与第一个示例相当,但此代码需要一个额外的独立行以将 list_length 值绑定到 len(some_list)

另一个等效代码样本可能只会计算len(some_list)两次:一次在if陈述中,一次在print陈述中。

1some_list = [1, 2, 3]
2if len(some_list) > 2:
3    print("List length of", len(some_list), "is too long")

分配表达式有助于避免额外的行或双重计算。

<$>[注] 注: 任命表达式是一个有用的工具,但并不绝对必要。 使用您的判断力,并在显著提高段落可读性时将任命表达式添加到您的代码中。

在下一节中,我们将探索在循环中使用分配表达式。

循环中使用分配表达式

分配表达式通常在 while loop中工作得很好,因为它们允许我们将更多背景折叠到循环状态中。

考虑下面的示例,将用户输入函数嵌入到同时循环状态中:

1while (directive := input("Enter text: ")) != "stop":
2    print("Received directive", directive)

如果您运行此代码,Python 将不断提示您从键盘输入文本,直到您输入停止这个词。

1>>> while (directive := input("Enter text: ")) != "stop":
2... print("Received directive", directive)
3...
4Enter text: hello
5Received directive hello
6Enter text: example
7Received directive example
8Enter text: stop
9>>>

指令表达式 (指令 :=输入("输入文本: ")) 将指令的值绑定到通过输入函数从用户那里获取的值。

如果你没有使用任命表达式,你可能会写一个相当于输入的循环,如:

1directive = input("Enter text: ")
2while directive != "stop":
3    print("Received directive", directive)
4    directive = input("Enter text: ")

这个代码在功能上与具有分配表达式的代码相同,但需要四个总线(而不是两行)。它还在两个地方重复了输入(输入文本: )`的调用。

到目前为止,您已经在如果陈述和循环中使用了任务表达式,在下一节中,您将在列表理解中使用任务表达式。

在清单理解中使用分配表达式

我们也可以在 [列表理解] 中使用分配表达式(https://andsky.com/tech/tutorials/understanding-list-comprehensions-in-python-3)。 列表理解允许您通过在序列中重复并可能添加满足某些条件的列表元素来简化列表,就像列表理解一样,我们可以使用分配表达式来提高可读性,并使我们的代码更简洁。

请考虑以下示例,该示例使用列表理解和分配表达式来构建重复整数列表:

1def slow_calculation(x):
2    print("Multiplying", x, "*", x)
3    return x * x
4
5[result for i in range(3) if (result := slow_calculation(i)) > 0]

如果您运行以前的代码,您将收到以下内容:

1[secondary_label Output]
2Multiplying 0 * 0
3Multiplying 1 * 1
4Multiplying 2 * 2
5[1, 4]

定义一个函数名为 slow_calculation,它将给定的数字 x 加倍为它自己。 然后一个列表理解通过 012 重复,返回为 range(3)。 一个分配表达式将 result 值与 slow_calculation 返回的 i 联系起来。 您将 result 添加到新构建的列表中,只要它大于 0。 在这个例子中, 012 都以自己倍增,但只有结果 1(1 * 1)和 4(2 * 2)满足比 0 更大的条件,并成为最终列表 1,

slow_calculation函数在绝对词汇中并不一定是慢的,但旨在说明有效性的一个重要点。

1def slow_calculation(x):
2    print("Multiplying", x, "*", x)
3    return x * x
4
5[slow_calculation(i) for i in range(3) if slow_calculation(i) > 0]

运行此操作时,您将收到以下输出:

1[secondary_label Output]
2Multiplying 0 * 0
3Multiplying 1 * 1
4Multiplying 1 * 1
5Multiplying 2 * 2
6Multiplying 2 * 2
7[1, 4]

在此前代码的变体中,您不使用任何分配表达式。相反,您呼叫slow_calculation最多两次:一次确保slow_calculation(i)大于0,并可能第二次将计算结果添加到最终列表中。

您现在已经将分配表达式与列表理解相结合,以创建有效和简洁的代码块。

结论

在本教程中,您使用分配表达式创建Python代码的紧凑部分,将值分配给如果陈述、同时循环和列表理解中的变量。

有关其他分配表达式的更多信息,请参阅 PEP 572 - 最初建议在Python中添加分配表达式的文档。

您可能还想在我们的 主题页面上查看我们的其他 Python 内容。

Published At
Categories with 技术
Tagged with
comments powered by Disqus