什么是海象运算符
海象运算符,是Python 3.8 全新推出的二元运算符,它在官方文档中的描述是『可在表达式内部为变量赋值』。说实话,我第一次看到这个描述,也是很奇怪。因为Python是动态语言,赋值语句用一个=就行。而不用像Golang一样:它的海象运算符是为了简化,不用申明变量类型。为了让我们明白这个海象运算符的作用,Python官方给我们举了一些例子:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
试想一下,如果没有海象运算符,我们能达到同样的效果,需要做的是
n = len(a)
if n > 10:
print(f"List is too long ({n} elements, expected <= 10)")
这种代码的缺点一个是比较啰嗦,单独拎出一个鸡肋变量作为一行,也会造成阅读代码时可能无法准确抓到整体逻辑。另一个潜在的问题是,如果a没有__len__方法呢?
于是为了避免上述问题,海象运算符应运而生。第一,它避免了啰嗦的鸡肋变量的占用代码块问题;另一方面,也避免了方法不存在或赋值不成功的尴尬。
海象运算符在计算一阶差分中的妙用
Raymond Hettinger提出了一个利用海象运算符,解决以前需要用for循环才能办到的list列表中产生一阶差分的问题。
所谓的一阶差分,就是当前元素减去它的前驱元素。但由于位置为0的元素不存在前驱元素,因此在过往的Python代码中,需要单独把第一个元素拎出来讨论。但是有了海象运算符后,代码可以写成
data = [10, 14, 34, 49, 70, 77]
prev = 0; [-prev + (prev := x) for x in data]
是的,你没有看错。在列表生成式中,我们利用海象运算符反复给prev重新赋值,这样一来,就可以直接在列表生成式中计算一阶差分了。这就是海象运算符在生成一阶差分问题上的妙用。