python3.8--海象运算符

2,394 阅读2分钟

python3.8在2019年10月14日成功发布,打开python3.8官方文档更新内容页面,首先我们就会看到一个新的语法。

海象运算符

There is new syntax := that assigns values to variables as part of a larger expression. It is affectionately known as “the walrus operator” due to its resemblance to the eyes and tusks of a walrus.

:=是一个将值赋给一个更大的表达式中的变量的新的语法。由于:=特别像海象的眼睛和象牙,所以亲切地称为“海象运算符”。

下面这个是官方给的一个示例:

# python 3.8+
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

就这么看,好像没看出什么,没有对比就没有伤害嘛!

下面我们再看一下python3.8之前的写法:

# python 3.8-
n = len(a)
if n > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
# or
if len(a) > 10:
    print(f"List is too long ({len(a)} elements, expected <= 10)")

很明显,这里是省略了一个赋值的步骤。

对比之后,发现好像也没有觉得海象运算符有多好用,还不足够pythonic。

# python 3.8+
[clean_name.title() for name in names 
if (clean_name := normalize('NFC', name)) in allowed_names]

怎么样,这行代码足够pythonic了吧。

其中,clean_name就是一个对象名,不如替换成f

结果:

# python 3.8+
[ f.title() for name in names
 if (f := normalize('NFC', name)) in allowed_names]

normalize() 方法会按照指定的一种 Unicode 正规形式将当前字符串正规化。(如果该值不是字符串,则首先将其转换为一个字符串)

这里,我们用缩句的思想,给上面的代码更加简洁一下。

# python 3.8+
'''
其中,f(x)=normalize('NFC', name)
'''
[ f(x) for x in y if f(x)]

这里,f(x)=normalize('NFC', name)运行了两次,海象运算符可以简化流程,提高运行速度。

Try to limit use of the walrus operator to clean cases that reduce complexity and improve readability

尽量限制使用海象运算符来清理那些降低复杂性和提高可读性的案例