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

作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。

介绍

2019 年 10 月发布的Python 3.8通过:=语法为 Python 添加了赋值表达式赋值表达式语法有时也被称为“海象运算符”,因为它:=有点像长着獠牙的海象。

赋值表达式允许变量赋值发生在较大的表达式中。虽然赋值表达式对于编写正确的 Python 代码从来不是绝对必要的,但它们可以帮助使现有的 Python 代码更加简洁。例如,使用:=语法的赋值表达式允许在ifstatements内部分配变量,这通常可以通过消除if语句前后行中的变量赋值来生成更短、更紧凑的 Python 代码部分

在本教程中,您将在几个示例中使用赋值表达式来生成简洁的代码段。

先决条件

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

if语句中使用赋值表达式

让我们从一个如何在if语句中使用赋值表达式的示例开始

考虑以下检查列表长度并打印语句的代码:

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

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

Output
List length of 3 is too long

您初始化一个名为的列表some_list该列表包含三个元素。然后,该if语句使用赋值表达式((list_length := len(some_list))将命名的变量绑定list_length到 的长度some_listif语句计算为True因为list_length大于2您使用list_length变量打印字符串,该变量最初与赋值表达式绑定,表明三元素列表太长。

注意:赋值表达式是Python 3.8 中引入的一个新特性要运行本教程中的示例,您需要使用 Python 3.8 或更高版本。

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

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

此代码示例是等同于第一实施例,但是这个代码需要一个额外的独立行的值绑定list_lengthlen(some_list)

另一个等效的代码示例可能只计算len(some_list)两次:一次在if语句中,一次在print语句中。这将避免产生将变量绑定到 的值所需的额外行len(some_list)

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

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

注意:赋值表达式是一个有用的工具,但不是绝对必要的。当代码显着提高段落的可读性时,请使用您的判断并在代码中添加赋值表达式。

在下一节中,我们将探索在while循环内使用赋值表达式

while循环中使用赋值表达式

赋值表达式通常在while循环中工作得很好,因为它们允许我们将更多上下文折叠到循环条件中。

考虑以下inputwhile循环条件中嵌入用户函数的示例

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

如果您运行此代码,Python 将不断提示您从键盘输入文本,直到您键入单词stop一个示例会话可能如下所示:

>>> while (directive := input("Enter text: ")) != "stop":
...     print("Received directive", directive)
...
Enter text: hello
Received directive hello
Enter text: example
Received directive example
Enter text: stop
>>>

赋值表达式(directive := input("Enter text: "))将 的值绑定directive到通过input函数从用户处检索到的值您将返回值绑定到变量directive,然后在while循环体中打印出来while只要您键入循环就会退出stop

如果您没有使用赋值表达式,您可能已经编写了一个等效的input循环,例如:

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

此代码在功能上与带有赋值表达式的代码相同,但总共需要四行(而不是两行)。它还会input("Enter text: ")在两个地方复制调用。当然,编写等效while循环的方法有很多,但前面介绍的赋值表达式变体很紧凑,并且很好地捕捉了程序的意图。

到目前为止,您已经在if语句和while循环中使用了赋值表达式在下一节中,您将在列表推导式中使用赋值表达式。

在列表推导式中使用赋值表达式

我们也可以在列表推导式中使用赋值表达式列表推导式允许您通过迭代序列并可能将满足某些条件的元素添加到列表中来简洁地构建列表。与列表推导式一样,我们可以使用赋值表达式来提高可读性并使我们的代码更加简洁。

考虑以下示例,该示例使用列表推导式和赋值表达式来构建乘以整数的列表:

def slow_calculation(x):
    print("Multiplying", x, "*", x)
    return x * x

[result for i in range(3) if (result := slow_calculation(i)) > 0]

如果您运行前面的代码,您将收到以下信息:

Output
Multiplying 0 * 0 Multiplying 1 * 1 Multiplying 2 * 2 [1, 4]

定义一个函数命名slow_calculation是乘以给定数量x与本身。列表解析反复的遍历01以及2由归国range(3)赋值表达式将值绑定resultslow_calculationwith的返回iresult只要大于 0 就将加入到新建的列表中。在本例中,01、 和2都与自己相乘,但只有结果1( 1 * 1) 和4( 2 * 2) 满足大于0条件并成为最终结果的一部分列表[1, 4]

slow_calculation函数的绝对值不一定很慢,但旨在说明有关效率的一个重要观点。考虑上一个没有赋值表达式的示例的替代实现:

def slow_calculation(x):
    print("Multiplying", x, "*", x)
    return x * x

[slow_calculation(i) for i in range(3) if slow_calculation(i) > 0]

运行此程序,您将收到以下输出:

Output
Multiplying 0 * 0 Multiplying 1 * 1 Multiplying 1 * 1 Multiplying 2 * 2 Multiplying 2 * 2 [1, 4]

在前面代码的这个变体中,您没有使用赋值表达式。相反,您slow_calculation最多调用两次:一次以确保slow_calculation(i)大于0,第二次可能将计算结果添加到最终列表中。0只与自身相乘一次,因为0 * 0不大于0然而,其他结果会被双重计算,因为它们满足大于 0 的条件,然后重新计算它们的结果以成为最终列表的一部分[1, 4]

您现在已经将赋值表达式与列表推导式结合起来,以创建既高效又简洁的代码块。

结论

在本教程中,您使用赋值表达式来制作 Python 代码的紧凑部分,为if语句、while循环和列表推导式中的变量赋值

有关其他赋值表达式的更多信息,您可以查看PEP 572——最初提议向 Python 添加赋值表达式的文档。

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁