python := 海象運算符

最近在做算法題

越來越發(fā)現python寫法 真的挺好用的 記下來?

map(lambda x: sum(x))? 中?lambda代表匿名函數

re.findall(r'0+|1+',s)? 是正則表達式

:= 海象運算符


背景:python 3.8正式版最近更新了,其中PEP572中的海象運算符獲得正式python版本的支持.我看了官網的文檔還有其它大神寫的這個東西,我感覺在將來的python語句中是非常實用的一個東西,所以寫下這篇博客來介紹、介紹,同時也是自己學習新版特性,盡管我司生產環(huán)境還停留在 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.

中譯過來就是:咱們這新開發(fā)了一種語法,它是一個強大的表達式,會把表達式的一部分賦值給變量,因為很像海象的眼睛和象牙,所以成為海象操縱者(掌控雷電的感覺(~-^)。聽起來有點懵,可能是我的翻譯水準不夠把。

描述之后呢,官網給了一些例子:

1

if(n:=len(a))>10:print(f"List is too long ({n} elements, expected <= 10)")


在這個例子里面,文檔強調通過使用海象表達式,避免len()方法運行兩次,從而提高了運行速度.

假如在沒有海象運算符的時候,我們會怎么來寫這段代碼呢?來試一試:

iflen(a)>10:print(f"List is to long({len(a)} elements, expected <= 10)")


或者這樣寫,避免使用兩次len方法,卻又多了一次賦值給中間變量的步驟.

n=len(a)ifn>10:print(f"List is to long({n} elements, expected <= 10)")

?我覺得一個好處就在于這里,為我們省去了一個賦值中間變量的步驟.

2

接下來,文檔又給出了第二個例子,關于海象運算符在正則中的應用

discount=0.0if(mo:=re.search(r'(\d+)% discount',advertisement)):discount=float(mo.group(1))/100.0


背景應該是這樣的,代碼想從一段advertisement的文本中,拿到打折的百分比,然后通過除法得到百分比數. 在這里面,海象運算符干了些什么呢?我們來看哈,雖然正則匹配的語句只用了一次,但它卻在兩個 地方起了作用,一次是檢測匹配是否發(fā)生,也就是if控制語句,還有一次是提取分子.同樣用python3.8之前的語句來寫這個語句:

discount=0.0mo=re.search(r'(\d+)% discount',advertisement)ifmo:discount=float(mo.group(1))/100.0


和上面的例子相似,海象運算符替我們省去了中間賦值的步驟,讓代碼更加整潔了.

3

接下來,文檔又給了兩個例子,首先是一個 while循環(huán)控制,還是省去了賦值的步驟:

# Loop over fixed length blockswhile(block:=f.read(256))!='':process(block)


背景:代碼讀取一個文件,當不為空執(zhí)行操作,同樣看沒有海象運算符,我們會怎么寫:

while1:block=f.read(256)ifblock!='':process(block)else:break


同樣是 賦值一氣呵成,這讓我認為海象運算符的作用在于,把計算語句的結果賦值給變量,然后,變量可以在代碼塊里執(zhí)行運用.

4

接下來是最后一個例子:

[clean_name.title()fornameinnamesif(clean_name:=normalize('NFC',name))inallowed_names]


背景是一個列表推導式里面,需要計算得到符合過濾條件的值,這個可以稍稍簡寫下,會顯得更加通透:

[o.title()foriinnamesifo:=f(i)inallowed_names]# 在這里我把: clean_name normalize('NFC', name) 比做了一個方法更簡潔一點:[yforxinnamesif(y:=f(x))]


同樣我們最簡潔的方式來改寫這段代碼:

[f(x)forxinnamesiff(x)]


可以看到f(x)執(zhí)行了兩次,故此可以看到海象運算符的用法了吧,即簡化流程,提高運算速度.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容