【转载】:Python 海象运算符 := - 知乎
海象运算符
海象运算符的英文原名叫 Assignment Expresions ,即 赋值表达式。是Python 3.8新增的语法 :=,在 PEP 572 中提出。
海象运算符由一个 : 和 一个 = 组成,即 := 。因为它看起来就是一个海象旋转 90° 而成,很像海象的眼睛和长牙。可在表达式内部为变量赋值。
官网说明文档
Python 3.8 有什么新变化docs.python.org/zh-cn/3/whatsnew/3.8.html
PEP 572 - Assignment Expressionspeps.python.org/pep-0572/
语法
海象运算符的语法格式是:
(variable_name := expression or value)
即一个变量名后跟一个表达式或者一个值,这个和赋值运算符 =
类似,可以看作是一种新的赋值运算符。
用法
1. 用于条件表达式
示例1:
a = 15
if a > 10:
print('hello, walrus operator!')
海象运算符:
if a := 15 > 10:
print('hello, walrus operator!')
示例2:
赋值表达式可以避免调用 len() 两次:
n = len(a)
if n > 10:
print(f"List is too long ({n} elements, expected <= 10)")
使用海象运算符
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
2. 用于 while
循环
(1)n
次循环的一般写法:
n = 5
while n:
print('hello, walrus operator!')
n -= 1
使用海象运算符
n = 5
while (n := n - 1) + 1: # 需要加1是因为执行输出前n就减1了
print('hello, walrus operator!')
(2) 实现一个密码输入检验的一般写法:
while True:
psw = input("请输入密码:")
if psw == "123":
break
更优雅的实现方式:海象运算符。
while (psw := input("请输入密码:")) != "123":
continue
(3)读取一个文件的每一行并输出:
fp = open("test.txt", "r")
while True:
line = fp.readline()
if not line:
break
print(line.strip())
fp.close()
更简洁的实现:
fp = open("test.txt", "r")
while line := fp.readline():
print(line.strip())
(4)适用于配合 while 循环计算一个值来检测循环是否终止,而同一个值又在循环体中再次被使用的情况:
# Loop over fixed length blocks
while True:
block = f.read(256)
if block != '':
process(block)
else:
break
使用海象运算符
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
3. 用于列表推导式
计算元素平方根,并保留平方根大于 5
的值:
nums = [16, 36, 49, 64]
def f(x):
print('运行了函数f(x)1次。')
return x ** 0.5
print([f(i) for i in nums if f(i) > 5])
以上执行后的输出为:
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
[6.0, 7.0, 8.0]
一共就 4
个数字,但是函数被执行了 7
次。这是因为有三个数字满足列表推导式的条件,需要再额外计算 3
次。当程序数据巨大的时候,这将浪费大量性能。
让我们来看看使用 :=
的实现结果如何:
nums = [16, 36, 49, 64]
def f(x):
print('运行了函数f(x)1次。')
return x ** 0.5
print([n for i in nums if (n := f(i)) > 5])
执行后的输出:
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
运行了函数f(x)1次。
[6.0, 7.0, 8.0]
函数只执行了 4
次,函数执行结果被 n
储存,不需要额外计算。性能优于不使用 :=
的。
另一个值得介绍的用例出现于列表推导式中,在筛选条件中计算一个值,而同一个值又在表达式中需要被使用:
[clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]
当然,海象运算符同样适合用于字典推导式和集合推导式。
4. 说明
在合适的场景中使用海象运算符可以降低程序复杂性,简化代码。一方面,可以写出优雅而简洁的 Python 代码;另一方面,可以看懂他人的代码。在一些实例中,甚至可以提高程序的性能。
不要为了使用海象运算符而使用!!!
请尽量将海象运算符的使用限制在清晰的场合中,以降低复杂性并提升可读性。