Python3.8新增 :=海象運算符


背景: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM