前言:
Python使用缩进来标识语句块, 来表明代码之间的逻辑层级关系, 有的时候一些简单的代码逻辑,确写了好几行, 看起来既不简洁也不优雅.
其实Python提供了更贴近自然语言的语法, 从而写出更高可读性的代码. 本文介绍一下海象操作符.
我们经常遇见这样的代码
# example 1
In [1]: lst = [1, 2, 3, 4]
In [2]: n = len(lst)
In [3]: if n > 3:
print(f"List is too long {n} elements, expected <= 3")
# example 2
In [4]: lst = [1, 2, 3, 4]
In [5]: if len(lst) > 3:
...: print(f"List is too long {len(lst)} elements, expected <= 3")
在条件语句之后的代码块中, 如果需要用到条件的值,
一种方法是要赋值给一个中间变量 n = len(lst)该然后使用变量n, 如上example 1
如果不想用赋值给一个变量, 则需要在代码中再次执行表达式. 如上example 2中 len(lst)被执行了2次. Python 3.8 中引入了新的语法 海象运算符:=
可以帮我们解决这个问题
In [1]: lst = [1, 2, 3, 4]
In [2]: if (n:=len(lst)) > 3:
...: print(f"List is too long {n} elements, expected <= 3")
该:=
运算符的正式名称为赋值表达式运算符。也被称为海象运算符, 原因是=比较像海象那俩大牙.
1. 海象运算符的原理
海象表达式语法
var := <expression>
与一般的赋值语句 var = expr 不同, 海象运算符允许我们在同一个表达式中为变量赋值并返回该值。在ipython中输入
In [1]: (walrus := 3)
Out[1]: 3
In [2]: walrus
Out[2]: 3
可以看到, 赋值语句同时返回了 valrus的当前值.
2. 海象运算符的使用
2.1 在while 语句中使用海象运算符
In [1]: n = 19
In [2]: while n > 0:
...: print('count down: ', n)
...: n = n-1
# 使用海象运算符
In [3]: n = 19
In [4]: while (n:= n-1) > 0:
...: print('count down: ', n)
在读取可耗尽的生成器资源时,例如文本读取,代码更加简洁
In [1]: chunk = resource.read(8192)
In [2]: while chunk:
...: process(chunk)
...: chunk = resource.read(8192)
# 使用海象运算符
In [3]: while chunk := resource.read(8192):
...: process(chunk)
2.2 列表表达式中使用
filtered_data = [
f(x) for x in data
if f(x) is not None
]
上面代码中,条件语句和赋值阶段中 f(x) 会被执行2次。 使用海象预算符, 则只需执行一次
filtered_data = [
y for x in data
if (y := f(x)) is not None
]
总结:
海象运算符可以为变量赋值的同时返回该运算符, 用作条件判断。
适用场景, 后续要使用条件语句判断的数据时。