Python 3.8 引入的海象运算符(Walrus Operator),语法为 :=。它允许在表达式内部为变量赋值,并返回被赋的值。这个特性核心在于减少重复计算和简化嵌套代码。
1 基础概念
海象运算符本质上是一个赋值表达式。与传统语句不同,它不仅执行赋值动作,还产生一个值,这使得我们可以把赋值嵌入到更大的逻辑判断中。
2 基础用法
2.1 条件语句中的赋值
以前我们写条件判断时,往往需要先赋值再判断,现在可以合并了。
# 传统写法
data = fetch_data()
if data:
process(data)
使用海象运算符后,逻辑更紧凑:
if (data := fetch_data()):
process(data)
注意括号的使用。虽然优先级上 := 较低,但为了可读性,建议加上括号。
2.2 循环中的赋值
在处理迭代器或生成器时,海象运算符能避免重复调用。
while line := file.readline():
if not line.strip():
continue
print(line)
这样既读取了行,又直接用于循环条件,省去了额外的变量声明。
2.3 表达式内部复用
当某个复杂计算结果需要在多处使用时,无需先存变量。
result = max((x * y for x, y in pairs), default=0)
如果还需要用到中间过程,比如记录最大值来源,就可以用 := 在生成器里捕获。
3 进阶技巧
3.1 列表推导式中的过滤
在列表推导式中,我们经常需要基于计算结果进行过滤。海象运算符让这种模式变得优雅。
# 过滤掉长度小于 5 的单词,同时保留原始数据
words = [w for w in words if (length := len(w)) > 5]
这里 length 变量在推导式作用域内可用,避免了重复调用 len()。
3.2 避免重复调用函数
有些函数调用有副作用或者开销大,比如网络请求或正则匹配。海象运算符确保只调用一次。
match = re.match(pattern, text)
if .group():
(.group())


