在Python3.8中新添加了赋值表达式 :=
,由于长得与海象的眼睛和象牙很神似,它被亲切的成为“海象表达式”。
它允许将键绑定到名称,然后重新用作计算相应值的一部分,官方推荐使用“海象表达式”来降低代码的复杂性和可读性。
看看怎么用
如果我们想要判断一个列表的长度是否大于10, 如果大于10我们就提示并打印列表长度,一般我们可以这么写:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
if len(a) > 10:
print("列表太长了,一共有{}个元素,希望小于等于10个。".format(len(a)))
在这里我们调用了两个 len()
函数,我们也可以换个写法:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
if (n := len(a)) > 10:
print("列表太长了,一共有{n}个元素,希望小于等于10个。")
在比较 len(a)
与 10
的同时,将 len(a)
的值赋给 n
,在下面打印的时候使用 n
就可以了,这样就避免调用两次 len()
。
有用吗
也许你会说这看起来并没有显得多简洁,我们可以同过在比较前,先进行赋值的方法来避免调用两次len()
,就像这样:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = len(a)
if n > 10:
print("列表太长了,一共有{n}个元素,希望小于等于10个。")
但实际上,程序员往往很看重写更少的行,就算可能会因此减慢了程序的运行速度。
比如,这样写其实更有效率:
match = re.match(data)
group = match.group(1) if match else None
但是,有时候程序员宁愿调用两次,来使得只写一行,就像这样:
group = re.match(data).group(1) if re.match(data) else None
如果使用海象表达式那么我们可以这么写:
group = (match := re.match(data)).group(1) if match else None
同样有时候程序员会选择做更多的工作来减少缩进的次数,比如
match1 = pattern1.match(data)
match2 = pattern2.match(data)
if match1:
result = match1.group(1)
elif match2:
result = match2.group(2)
else:
result = None
即使pattern1有匹配项,此代码也会尝试匹配pattern2(在这种情况下,永远不会使用pattern2上的匹配项)。更有效的重写本来是:
match1 = pattern1.match(data)
if match1:
result = match1.group(1)
else:
match2 = pattern2.match(data)
if match2:
result = match2.group(2)
else:
result = None
利用海象表达式,我们就可以这么写:
if (match1 := pattern1.match(data)):
result = match1.group(1)
elif (match2 = pattern2.match(data)):
result = match2.group(2)
else:
result = None
这样看来是不是很好用呢?那么,你会喜欢上这个可爱的 :=
吗?
参考资料
[1]Python Developer’s Guide: https://www.python.org/dev/peps/pep-0587/
![](https://img-blog.csdnimg.cn/20200224005620442.jpg)