最近在做算法題
越來越發(fā)現python寫法 真的挺好用的 記下來?
map(lambda x: sum(x))? 中?lambda代表匿名函數
re.findall(r'0+|1+',s)? 是正則表達式
:= 海象運算符
轉
ps:這是3.8 新特性網址:https://docs.python.org/3/whatsnew/3.8.html
官網介紹:Assignment expressions(賦值表達式)
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)")
?我覺得一個好處就在于這里,為我們省去了一個賦值中間變量的步驟.
接下來,文檔又給出了第二個例子,關于海象運算符在正則中的應用
discount=0.0if(mo:=re.search(r'(\d+)% discount',advertisement)):discount=float(mo.group(1))/100.0
discount=0.0mo=re.search(r'(\d+)% discount',advertisement)ifmo:discount=float(mo.group(1))/100.0
和上面的例子相似,海象運算符替我們省去了中間賦值的步驟,讓代碼更加整潔了.
接下來,文檔又給了兩個例子,首先是一個 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í)行運用.
[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)]