Pyhton3.8 引入了海象(walrus)运算符:=。这是一种赋值判断运算符。赋值运算一般写作 a = b,而walrus运算写作 a := b。 它的用处就是它可以在不允许使用=的地方进行赋值,例如在if语句中。
注: 因为 :=旋转90度后看起来像海象的眼睛和象牙,所以叫做海象运算符
例如,我有一个果汁商店。下面是水果的数量。
fresh_fruit = {
'apple': 10,
'banana': 8,
'lemon': 5,
}
顾客点柠檬汁,我们要确定是否有柠檬(True or False):使用海象表达式可以直接在if中赋值:
if count := fresh_fruit.get('lemon', 0):
make_lemonade(count)
else:
out_of_stock()
:= 首先对count赋值,然后将这个值作为表达式的值,也就是if语句的判断条件。
这两个步骤,赋值再判断(assign and the evaluate)就是海象表达式的含义。
继续下面的苹果汁例子。做苹果汁需要4个苹果,因此我们需要判断苹果数量是否>=4。
使用海象表达式:
if (count := fresh_fruit.get('apple', 0)) >= 4:
make_cider(count)
else:
out_of_stock()
另一种常见模式是根据条件赋值一个变量,后面使用该变量。例如,我要制作香蕉冰沙,需要两个香蕉切片。首先根据香蕉数量赋值切片数量,然后使用切片制作香蕉冰沙。
pieces = 0
if (count := fresh_fruit.get('banana', 0)) >= 2:
pieces = slice_bananas(count)
try:
smoothies = make_smoothies(pieces)
except OutOfBananas:
out_of_stock()
或者:
if (count := fresh_fruit.get('banana', 0)) >= 2:
pieces = slice_bananas(count)
else:
pieces = 0
try:
smoothies = make_smoothies(pieces)
except OutOfBananas:
out_of_stock()
刚接触Python的程序员发现缺乏switch/case语句(Pyhon3.10已经有了类似的功能match/case)。近似的会使用多个if,elif,else嵌套。
count = fresh_fruit.get('banana', 0)
if count >= 2:
pieces = slice_bananas(count)
to_enjoy = make_smoothies(pieces)
else:
count = fresh_fruit.get('apple', 0)
if count >= 4:
to_enjoy = make_cider(count)
else:
count = fresh_fruit.get('lemon', 0)
if count:
to_enjoy = make_lemonade(count)
else:
to_enjoy‘= 'Nothing'
使用海象表达式进行修改:
if (count := fresh_fruit.get('banana', 0)) >= 2:
pieces = slice_bananas(count)
to_enjoy = make_smoothies(pieces)
elif (count := fresh_fruit.get('apple', 0)) >= 4:
to_enjoy = make_cider(count)
elif count := fresh_fruit.get('lemon', 0):
to_enjoy = make_lemonade(count)
else:
to_enjoy = 'Nothing'
新手Python程序员可能发现Python没有do/while循环。
def pick_fruit():
...
def make_juice(fruit, count):
...
bottles = []
fresh_fruit = pick_fruit()
while fresh_fruit:
for fruit, count in fresh_fruit.items():
batch = make_juice(fruit, count)
bottles.extend(batch)
fresh_fruit = pick_fruit()
这有些重复,fresh_fruit = pick_fruit()语句分别在循环前和循环体内出现。改进的一种办法是使用下面的“半循环结构”(loop-and-a-half)。
bottles = []
while True: # Loop
fresh_fruit = pick_fruit()
if not fresh_fruit: # And a half
break
for fruit, count in fresh_fruit.items():
batch = make_juice(fruit, count)
bottles.extend(batch)
使用赋值并判断的海象表达式可以解决这个问题。
bottles = []
while fresh_fruit := pick_fruit():
for fruit, count in fresh_fruit.items():
batch = make_juice(fruit, count)
bottles.extend(batch)
通常, 当你发现在一组中多次重复相同的赋值时,就应该考虑使用海象表达式。