walrus操作符(:=),或称为表达式赋值操作符,自Python 3.8版本起引入。它的引入是为了允许在表达式中直接给变量赋值(例如在循环或if条件中),即可以立即获取并使用函数或计算的结果,而不需要重复调用两次。
walrus解决的问题是:避免重复计算或编写额外的代码行仅仅用于赋值;在引入之前,必须单独调用一次,并在后续使用结果。
解决方案是:现在可以在条件内部直接给表达式赋值给变量,使代码更加简洁,并且有时也更易读。重要的是要记住,过度使用walrus有时会使代码难以理解,尤其是对于经验较少的同事。
代码示例:
while (line := input('请输入字符串: ')) != 'exit': print(f'您输入的是: {line}')
关键特点:
可以使用walrus操作符赋值给全局变量吗?
可以,但是walrus在其使用的作用域内有效。需要记住LEGB规则,并谨慎使用函数外的变量。
x = expr 与 (x := expr) 有什么区别?
x = expr 是独立的赋值语句,而(x := expr)是一个表达式,它返回expr的结果并在另一个表达式中将其赋值给x。在许多情况下,后者可以在if条件、while循环或者列表推导式中使用。
walrus可以在列表推导式和生成器内使用吗?
可以,walrus在推导式中广泛使用,这特别方便以避免重复计算。
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # 这里n保存了int(s)的结果,节省了计算
开发者写了一个很长且复杂的if,包含多个嵌套的walrus:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
优点:
缺点:
有意识的使用以节省计算和提高可读性:
while (line := sys.stdin.readline()) != '': process(line)
优点:
缺点: