022_py_assignment_expressions.adoc
Edited: Monday 12 May 2025

Python 语法 - 海象运算符:=

海象运算符的英文原名叫 Assignment Expresions ,即 赋值表达式。

是Python 3.8新增的语法 :=,在 PEP 572 中提出。

海象运算符之所以叫这个名字是因为这个符号就像是一个海象逆时针90°倒过来一样,符号为一个冒号接着一个等号,是:=这样的。

用于条件表达式

海象运算符由一个 : 和 一个 = 组成,即:= ,可在表达式内部为变量赋值。
通常一个条件表达式我们会这样写

a = 15
if a > 10:
    print('hello, walrus operator!')
使用海象运算符后

if a := 15 > 10:
    print('hello, walrus operator!')
使用赋值表达式,避免len(a)被调用2次

a = "hello world"
n = len(a)
if n > 10:
    print(f'a的长度{n}')
使用海象运算符

a = "hello world"
if (n := len(a)) > 10:
    print(f'a的长度{n}')
注意if后面的 海象运算符需用圆括号包起来,否则运算结果不一样。

用于 while 循环
1.n 次循环的一般写法:

n = 5
while n:
    print(f"循环执行,n->{n}")
    n -= 1
使用海象运算符

n = 5
while (n := n - 1) + 1:
    print(f"循环执行,n->{n}")

while 后面需加1,因为赋值的时候就直接-1了。

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)

列表推导式
在列表推导式中调用一个函数

nums = [“22”, “hello”, “world”, “上海-悠悠”]

def f(x):
print(“函数被调用了—-”)
return len(x)

print([f(x) for x in nums if f(x) > 2])
运行结果

函数被调用了—-
函数被调用了—-
函数被调用了—-
函数被调用了—-
函数被调用了—-
函数被调用了—-
函数被调用了—-
[5, 5, 5]
使用海象运算符

nums = [“22”, “hello”, “world”, “上海-悠悠”]

def f(x):
print(“函数被调用了—-”)
return len(x)

print([n for x in nums if (n := f(x)) > 2])

运行结果

函数被调用了—-
函数被调用了—-
函数被调用了—-
函数被调用了—-
[5, 5, 5]
这样可以减少f(x)函数被调用的次数。

三元表达式
普通写法

x, y = 200, 150
x = x - y
msg = f"余额{x}元" if x > 100 else f"只有{x}元"
print(msg)
使用海象运算符

x, y = 200, 150

msg = f"余额{x}元" if (x := x - y) > 100 else f"只有{x}元"
print(msg)

海象运算符可以用于一些需要表达式的地方,比如if语句、while循环、推导式、三元表达式等。
它一定程度上减少了代码的行数,使代码更加简洁,甚至在某些情况下可以提高程序的效率;
但通常情况下,使用海象运算符会降低代码的可读性,使代码更难以理解。