
Python 3.8 中引入的 walrus 运算符是一种语法功能,可简化某些编程模式。正式名称为 “assignment expression” 并由 := 表示,此运算符允许在表达式中进行赋值。
什么是 Walrus 运算符?walrus 运算符将赋值与表达式组合在一起。以前,Python 中的赋值语句与表达式是分开的。使用 :=,可以将值作为另一个语句或表达式的一部分分配给变量。
赋值后跟条件检查walrus 运算符最简单的示例之一是将赋值与条件检查相结合。以下是它在实践中的工作原理:
不使用 walrus 运算符:
value = input("Enter a number: ")if value.isdigit(): print(f"You entered the number: {value}")else: print("That is not a valid number.")这种方法将赋值 (value = input(...)) 和条件 (if value.isdigit():) 分开。它有效,但在更复杂的场景中,分离可能会让人感觉重复。
使用 walrus 运算符:
if (value := input("Enter a number: ")).isdigit(): print(f"You entered the number: {value}")else: print("That is not a valid number.")此处,在条件检查期间分配 value 变量。结果更简洁,无需单独编写 input()。当赋值逻辑与条件紧密绑定时,此模式特别有用。
将赋值嵌入到另一行中walrus 运算符可用于将赋值嵌入到较长的代码行中。它通常会消除冗余变量或重复的函数调用。
考虑这样一个场景:您使用一个数字列表,并希望找到第一个大于阈值的数字。
不使用 walrus 运算符:
numbers = [3, 7, 1, 9, 2, 8]for number in numbers: if number > 5: result = number breakprint(f"First number greater than 5: {result}")这需要在循环中声明 result,在满足条件时中断。
使用 walrus 运算符:
numbers = [3, 7, 1, 9, 2, 8]if any((result := number) > 5 for number in numbers): print(f"First number greater than 5: {result}")在此示例中,result 在推导式中赋值。any() 函数在找到匹配项后立即赋值给 result 时评估条件。这种集成减少了样板代码,同时保持了清晰度。
常见用例:读取文件文件读取循环是 walrus 运算符的常见用例。假设您需要处理文件中的行,直到出现特定标记。
不使用 walrus 运算符:
with open("data.txt", "r") as file: line = file.readline() while line: print(line.strip()) line = file.readline()这种方法需要在循环内部和结束时重复 file.readline() 。
使用 walrus 运算符:
with open("data.txt", "r") as file: while (line := file.readline()): print(line.strip())while 循环现在将赋值直接集成到其条件中。这消除了冗余并保持代码简洁。
实际考虑walrus 运算符是一个强大的工具,但它并不总是最佳选择。过度使用会导致代码混淆。当赋值和表达式组合过多时,可读性可能会受到影响。当运算符可以提高清晰度并减少重复,而不会使代码更难理解时,请使用 Operator。
要记住的关键点保存代码行:walrus 运算符减少了在条件或循环之外重复赋值的需求。提高可读性:如果使用得当,它通过组合相关作使逻辑更加清晰。最适合简洁的条件:条件清晰、简单的场景受益最大。