玩命加载中 . . .

python assignment expression, :=


概述

最近在看《流畅的python》第二版,上册,第二章节有提及到:=,书中举例了一个list中某个值的访问,搜索一下相关资料,学习一下。果真此运算符比书中所提及的功能要丰富的多,故mark一下。

前言

经资料查询,从Python 3.8开始,引入了一项新的语法特性:“海象运算符”,它的正式名称是 Assignment Expressions(赋值表达式),标记为 :=。这个运算符允许你在表达式内进行变量赋值,从而可以在一个表达式中完成测试和赋值两个动作。由于它的外形像海象的眼睛和长牙,因此社区给它起了个昵称"海象运算符"。

海象运算符的一个典型用途是在条件语句中,它允许在测试某个条件的同时将其值赋给一个变量。不仅如此,它还可用于循环和其他许多场合,从而使代码更加简洁且易于理解。

场景一:列表推导式中元素访问

[last := x for x in range(10)]

我们使用 := 运算符将每个 x 的值赋给 last 变量。注意,这里的 last 实际上并没有在列表推导式中作为变量名 x 的别名使用,而是在整个推导式完成后,将最后一个元素的值赋给 last 变量。这个技巧允许我们在列表推导式完成后,通过 last 变量获取到这个新列表的最后一个元素。

生成的列表包含了从 0 到 9 的整数,如下所示:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

当你查询 last 变量时,它会返回列表中的最后一个元素,也就是 9。

再比如:

>>> import re
>>> data = "Some example numbers: 10, 20, and 30"
>>> (match := re.findall(r'\d+', data))
['10', '20', '30']
>>> match
['10', '20', '30']
>>> 

场景二:在 while 循环中读取用户输入直到空行出现。


# 传统的写法
user_input = input("Enter message: ")
while user_input:
    print(f'Echo: {user_input}')
    user_input = input("Enter message: ")


# 使用海象运算符
while (user_input := input("Enter message: ")):
    print(f'Echo: {user_input}')

在这个例子中,使用海象运算符让代码更简洁,减少了重复的 input 调用。

场景三:在 if 语句中使用,同时测试和赋值。

data = "Some example numbers: 10, 20, and 30"

# 传统做法
match = re.search('(\d+)', data)
if match:
    print(f"Found a number: {match.group(1)}")

# 使用海象运算符
if match := re.search('(\d+)', data):
    print(f"Found a number: {match.group(1)}")

在上述例子中,使用海象运算符可以在判断条件真假时同时捕获正则表达式捕获组(在这里是数字)。

场景四:需要多次使用某个昂贵的计算结果时。


# 传统做法
result = some_expensive_calculation_function()
if result:
    other_function(result)

# 使用海象运算符
if (result := some_expensive_calculation_function()):
    other_function(result)

在这个例子中,海象运算符让我们无需调用两次some_expensive_calculation_function()就能够重用其计算结果。

海象运算符提高了代码的可读性和编写效率,在合适的场景下使用可使得代码更加精简和优雅。然而,像所有新引入的语法特性一样,使用时应该注意代码的清晰性和易维护性,过度使用或者在不适当的情况下使用可能会增加代码的复杂性。

注意事项:

  • 海象运算符只能用于 Python 3.8 及以上版本。

  • 使用海象运算符时,应确保右侧的表达式是安全的,即不会引起异常。如果表达式可能抛出异常,那么使用海象运算符可能会导致代码的错误处理变得复杂。

  • 海象运算符主要用于简化代码,但它并不总是必要的。在某些情况下,使用传统的多行赋值和条件语句可能更清晰。

总之,合理&慎重的使用它!

PS:
写此文纯粹是好奇,但更推荐传统写法。


文章作者: Gavin Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gavin Wang !
  目录