賦值表達式(assignment expression)是Python 3.8新引入的語法,它會用到海象操作符(walrus operator)。 這種寫法可以解決某些持續已久的代碼重覆問題。a = b是一條普通的賦值語句,讀作a equals b,而a := b則是賦值表達式,讀作a walrus ...
賦值表達式(assignment expression)是Python 3.8新引入的語法,它會用到海象操作符(walrus operator)。
這種寫法可以解決某些持續已久的代碼重覆問題。a = b是一條普通的賦值語句,讀作a equals b,而a := b則是賦值表達式,讀作a walrus b。
這個符號為什麼叫walrus呢?因為把:=順時針旋轉90º之後,冒號就是海象的一雙眼睛,等號就是它的一對獠牙。這種表達式很有用,可以在普通的賦值語句無法應用的場合實現賦值,例如可以用在條件表達式的if語句裡面。
賦值表達式的值,就是賦給海象操作符左側那個標識符的值。
舉個例子
students = ["小明", "小紅", "小李", "小光"]
if len(students) >= 3:
print("學生人數超過3人,人數為{}".format(len(students)))
else:
print("學生人數不超過3人,人數為{}".format(len(students)))
上面例子中有三處用到了len(students),顯然,這樣會出現重覆獲取值的情況。
在Python中,一般的做法是,先定義一個變數count來存放len(students)的值,再使用該變數來進行之後的操作,如下:
students = ["小明", "小紅", "小李", "小光"]
count = len(students)
if count >= 3:
print("學生人數超過3人,人數為{}".format(count))
else:
print("學生人數不超過3人,人數為{}".format(count))
然而,在實際開發中,我們定義的如上面例子中count的變數值有多個,而且邏輯語句也會相對複雜很多,有時候很難第一時間發現這些變數值在邏輯語句中的作用。Python引入賦值表達式正是為瞭解決這樣的問題。
下麵使用海象操作符來改寫上面的例子
students = ["小明", "小紅", "小李", "小光"]
if (count := len(students)) >= 3:
print("學生人數超過3人,人數為{}".format(count))
else:
print("學生人數不超過3人,人數為{}".format(count))
新代碼雖然只省了一行,但讀起來卻清晰很多,因為這種寫法明確體現出count變數只與if塊有關。
這個賦值表達式先把:=右邊的值賦給左邊的count變數,然後對自身求值,也就是把變數的值當成整個表達式的值。由於表達式緊跟著if,程式會根據它的值是否滿足條件來決定該不該執行if塊。
這種先賦值再判斷的做法,正是海象操作符想要表達的意思。
同樣,我們也可以在列表推導式中使用賦值表達式
students = ["小明", "小紅", "小李", "小光"]
count_list = [count := len(students), count ** 2, count ** 3]
print(count_list)
在實際開發中,比較常用到的正則表達式也可以使用賦值表達式
import re
#學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
desc = "name: Tony"
if m := re.match("name: (.*)", desc):
name = m.group(1)
print(name)
總之,如果某個表達式或賦值操作多次出現在一組代碼裡面,那就可以考慮用賦值表達式把這段代碼改得簡單一些。