背景:python 3.8正式版最近更新了,其中PEP572中的海象運算符獲得正式python版本的支持.我看了官網的文檔還有其它大神寫的這個東西,我感覺在將來的python語句中是非常實用的一個東西,所以寫下這篇博客來介紹、介紹,同時也是自己學習新版特性,盡管我司生產環境還停留在 3.6,但並不影響我嘗嘗鮮.
ps:這是3.8 新特性網址:https://docs.python.org/3/whatsnew/3.8.html
官網介紹:Assignment expressions(賦值表達式)
There is new syntax := that assigns values to variables as part of a larger expression. It is affectionately known as “the walrus operator” due to its resemblance to the eyes and tusks of a walrus.
中譯過來就是:咱們這新開發了一種語法,它是一個強大的表達式,會把表達式的一部分賦值給變量,因為很像海象的眼睛和象牙,所以成為海象操縱者(掌控雷電的感覺(~-^)。聽起來有點懵,可能是我的翻譯水准不夠把。
描述之后呢,官網給了一些例子:
1
if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")
在這個例子里面,文檔強調通過使用海象表達式,避免len()方法運行兩次,從而提高了運行速度.
假如在沒有海象運算符的時候,我們會怎么來寫這段代碼呢?來試一試:
if len(a) > 10: print(f"List is to long({len(a)} elements, expected <= 10)")
或者這樣寫,避免使用兩次len方法,卻又多了一次賦值給中間變量的步驟.
n = len(a) if n > 10: print(f"List is to long({n} elements, expected <= 10)")
我覺得一個好處就在於這里,為我們省去了一個賦值中間變量的步驟.
2
接下來,文檔又給出了第二個例子,關於海象運算符在正則中的應用
discount = 0.0 if (mo := re.search(r'(\d+)% discount', advertisement)): discount = float(mo.group(1)) / 100.0
背景應該是這樣的,代碼想從一段advertisement的文本中,拿到打折的百分比,然后通過除法得到百分比數. 在這里面,海象運算符干了些什么呢?我們來看哈,雖然正則匹配的語句只用了一次,但它卻在兩個 地方起了作用,一次是檢測匹配是否發生,也就是if控制語句,還有一次是提取分子.同樣用python3.8之前的語句來寫這個語句:
discount = 0.0 mo = re.search(r'(\d+)% discount', advertisement) if mo: discount = float(mo.group(1)) / 100.0
和上面的例子相似,海象運算符替我們省去了中間賦值的步驟,讓代碼更加整潔了.
3
接下來,文檔又給了兩個例子,首先是一個 while循環控制,還是省去了賦值的步驟:
# Loop over fixed length blocks while (block := f.read(256)) != '': process(block)
背景:代碼讀取一個文件,當不為空執行操作,同樣看沒有海象運算符,我們會怎么寫:
while 1: block = f.read(256) if block != '': process(block) else: break
同樣是 賦值一氣呵成,這讓我認為海象運算符的作用在於,把計算語句的結果賦值給變量,然后,變量可以在代碼塊里執行運用.
4
接下來是最后一個例子:
[clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]
背景是一個列表推導式里面,需要計算得到符合過濾條件的值,這個可以稍稍簡寫下,會顯得更加通透:
[o.title() for i in names if o:=f(i) in allowed_names] # 在這里我把: clean_name normalize('NFC', name) 比做了一個方法
更簡潔一點:
[y for x in names if (y := f(x))]
同樣我們最簡潔的方式來改寫這段代碼:
[f(x) for x in names if f(x)]
可以看到f(x)執行了兩次,故此可以看到海象運算符的用法了吧,即簡化流程,提高運算速度.
PS:最近在學習Go,Go里面就有這個東西,它是用來簡化賦值語句的.
在Go里面,你需要用到 var 來進行賦值,如果你不想用var的話,就可以用 :=來進行賦值。
btw:學Go還真是有點蛋疼.
版權聲明:本文為CSDN博主「笑笑布丁」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_40244755/article/details/102685199