
運算符使值的賦值可以傳遞到表達式中。這通常會使語句數(shù)減少一個。例如:
my_list=[1,2,3]
count=len(my_list)
if count>3:
print(f"Error,{count}is too many items")
#when converting to walrus operator...
if(count:=len(my_list))>3:
print(f"Error,{count}is too many items")
如果您快速瀏覽了一下,就會理解對這個新操作的擔(dān)憂。似乎將兩個簡單的語句混為一談,以使收益最小。
假設(shè)對于為什么引入此運算符有合理答案?那么讓人很自然的想到,它在現(xiàn)實世界中如何有用?
下面我們介紹下采用海象運算符的方便之處。
While循環(huán)
雖然循環(huán)似乎是最常見的使用海象運算符的情況。在此處使用海象運算符的好處是可以在while語句中合并表達式和修飾符。
line=f.readLine()
while line:
print(line)
line=f.readLine()
#when converting to walrus operator...while line:=f.readLine():
print(line)
不過要注意,使用海象運算符更適合用于傳統(tǒng)的do/while循環(huán),因為賦值在循環(huán)表達式之前。請參見下面的差異:
n=0
while n<3:
print(n)#0,1,2
n+=1
#when converting to walrus operator...
w=0
while(w:=w+1)<3:
print(w)#1,2
會發(fā)現(xiàn)它在替換無限while循環(huán)中最有用:
while True:
p=input("Enter the password:")
if p=="the password":
break
#when converting to walrus operator...
while(p:=input("Enter the password:"))!="the password":
continue
能夠?qū)hile循環(huán)轉(zhuǎn)換為一個語句實在太棒啦。
列表理解
海象運算符對優(yōu)化某些列表理解語句很有幫助。有兩個標準1)需要過濾數(shù)據(jù),2)存儲taxing function的結(jié)果。讓我們看一下傳統(tǒng)的列表理解語句:
scores=[22,54,75,89]
valid_scores=[
longFunction(n)
for n in scores
if longFunction(n)
]
注意條件語句longFunction(n)了嗎?注意longFunction()被調(diào)用了兩次嗎?這是海象運算符的候選。
scores=[22,54,75,89]
valid_scores=[
result for n in scores
result:=longFunction(n)
]
在優(yōu)化了的代碼中,longFunction()僅被調(diào)用一次,隱含的降低了調(diào)用次數(shù)。
處理返回的數(shù)據(jù)
接下來是海象運算符的最有用的實現(xiàn)。具體來說,請求記錄(數(shù)據(jù)行)后,查詢返回數(shù)據(jù)時,需要對其進行處理。
#look for failed inspections
#if there are failed inspections,assign to technicianrecords=api.readFailedRecords()
if len(records)>0:
for record in records:
api.assignToTechnician(record)
仔細閱讀記錄,認真謹慎的敲代碼,以確保僅當(dāng)返回列表有數(shù)據(jù)該代碼塊才執(zhí)行:
if records:=api.readFailedRecords():
for record in records:
api.assignToTechnician(record)
就可讀性而言,此重構(gòu)的破壞性最小,實際上,在這種情況下,海象運算符更易于閱讀。與前兩個示例形成鮮明對比的是,前兩個示例對可讀性的影響較小,有利于省心和提高性能。
總結(jié)
海象運算符很新穎并且有爭議,但是只有時間會見證它逐漸被大家接收。你是否已開始在代碼中使用它了呢?
