日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Python中如何用海象操作符減少重復(fù)代碼

本篇文章給大家分享的是有關(guān)Python中如何用海象操作符減少重復(fù)代碼,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)于2013年開始,先為義馬等服務(wù)建站,義馬等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為義馬企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

a = b是一條普通的賦值語(yǔ)句,讀作a equals b,而a := b則是賦值表達(dá)式,讀作a walrus b。這個(gè)符號(hào)為什么叫walrus呢?因?yàn)榘?=順時(shí)針旋轉(zhuǎn)90°之后,冒號(hào)就是海象的一雙眼睛,等號(hào)就是它的一對(duì)獠牙。

Python中如何用海象操作符減少重復(fù)代碼

這種表達(dá)式很有用,可以在普通的賦值語(yǔ)句無(wú)法應(yīng)用的場(chǎng)合實(shí)現(xiàn)賦值,例如可以用在條件表達(dá)式的if語(yǔ)句里面。賦值表達(dá)式的值,就是賦給海象操作符左側(cè)那個(gè)標(biāo)識(shí)符的值。

舉個(gè)例子。如果有一筐新鮮水果要給果汁店做食材,那我們就可以這樣定義其中的內(nèi)容:

fresh_fruit = {     'apple': 10,     'banana': 8,     'lemon': 5, }

顧客點(diǎn)檸檬汁之前,我們先得確認(rèn)現(xiàn)在還有沒有檸檬可以榨汁。所以,要先查出檸檬的數(shù)量,然后用if語(yǔ)句判斷它是不是非零的值。

def make_lemonade(count):     print(f'Making {count} lemons into lemonade')  def out_of_stock():     print('Out of stock!')  count = fresh_fruit.get('lemon', 0) if count:     make_lemonade(count) else:     out_of_stock()

這段代碼看上去雖然簡(jiǎn)單,但還是顯得有點(diǎn)兒松散,因?yàn)閏ount變量雖然定義在整個(gè)if/else結(jié)構(gòu)之上,然而只有if語(yǔ)句才會(huì)用到它,else塊根本就不需要使用這個(gè)變量。所以,這種寫法讓人誤以為count是個(gè)重要的變量,if和else都要用到它,但實(shí)際上并非如此。

我們?cè)赑ython里面經(jīng)常要先獲取某個(gè)值,然后判斷它是否非零,如果是就執(zhí)行某段代碼。對(duì)于這種用法,我們以前總是要通過(guò)各種技巧,來(lái)避免count這樣的變量重復(fù)出現(xiàn)在代碼之中,這些技巧有時(shí)會(huì)讓代碼變得比較難懂。Python引入賦值表達(dá)式正是為了解決這樣的問(wèn)題。下面改用海象操作符來(lái)寫:

if count := fresh_fruit.get('lemon', 0):     make_lemonade(count) else:     out_of_stock()

新代碼雖然只省了一行,但讀起來(lái)卻清晰很多,因?yàn)檫@種寫法明確體現(xiàn)出count變量只與if塊有關(guān)。這個(gè)賦值表達(dá)式先把:=右邊的值賦給左邊的count變量,然后對(duì)自身求值,也就是把變量的值當(dāng)成整個(gè)表達(dá)式的值。

由于表達(dá)式緊跟著if,程序會(huì)根據(jù)它的值是否非零來(lái)決定該不該執(zhí)行if塊。這種先賦值再判斷的做法,正是海象操作符想要表達(dá)的意思。

檸檬汁效力強(qiáng),所以只需要一顆檸檬就能做完這份訂單,這意味著程序只需判斷非零即可。如果客人點(diǎn)的是蘋果汁,那就至少得用四個(gè)蘋果才行。按照傳統(tǒng)的寫法,要先從fresh_fruit這個(gè)字典里面查出蘋果(apple)的數(shù)量(count),然后在if語(yǔ)句里,根據(jù)這個(gè)數(shù)量構(gòu)造條件表達(dá)式(count  >= 4)。

def make_cider(count):     print(f'Making cider with {count} apples')  count = fresh_fruit.get('apple', 0) if count >= 4:     make_cider(count) else:     out_of_stock()

這段代碼與剛才那個(gè)檸檬汁的例子一樣,也過(guò)分突出了count變量的意義。下面改用海象操作符,把代碼寫得更清晰一些。

if (count := fresh_fruit.get('apple', 0)) >= 4:     make_cider(count) else:     out_of_stock()

與剛才那個(gè)例子一樣,修改之后的代碼也比原來(lái)少了一行。但是這次,我們還要注意另外一個(gè)現(xiàn)象:賦值表達(dá)式本身是放在一對(duì)括號(hào)里面的。為什么要這樣做呢?因?yàn)槲覀円趇f語(yǔ)句里面把這個(gè)表達(dá)式的結(jié)果跟4這個(gè)值相比較。

剛才檸檬汁的例子沒有加括號(hào),因?yàn)槟菚r(shí)只憑賦值表達(dá)式本身的值就能決定if/else的走向:只要表達(dá)式的值不是0,程序就進(jìn)入if分支。但是這次不行,這次要把這個(gè)賦值表達(dá)式放在更大的表達(dá)式里面,所以必須用括號(hào)把它括起來(lái)。當(dāng)然,在沒有必要加括號(hào)的情況下,還是盡量別加括號(hào)比較好。

還有一種類似的邏輯也會(huì)出現(xiàn)剛才說(shuō)的重復(fù)代碼,這指的是:我們要根據(jù)情況給某個(gè)變量賦予不同的值,緊接著要用這個(gè)變量做參數(shù)來(lái)調(diào)用某個(gè)函數(shù)。

例如,若顧客要點(diǎn)香蕉冰沙,那我們首先得把香蕉切成好幾份,然后用其中的兩份來(lái)制作這道冰沙。如果不夠兩份,那就拋出香蕉不足(OutOfBananas)異常。下面用傳統(tǒng)的寫法實(shí)現(xiàn)這種邏輯:

def slice_bananas(count):     print(f'Slicing {count} bananas')     return count * 4  class OutOfBananas(Exception):     pass  def make_smoothies(count):     print(f'Making a smoothies with {count} banana slices')  pieces = 0 count = fresh_fruit.get('banana', 0) if count >= 2:     pieces = slice_bananas(count)  try:     smoothies = make_smoothies(pieces) except OutOfBananas:     out_of_stock()

還有一種傳統(tǒng)的寫法也很常見,就是把if/else結(jié)構(gòu)上方那條pieces = 0的賦值語(yǔ)句移動(dòng)到else塊中。

count = fresh_fruit.get('banana', 0) if count >= 2:     pieces = slice_bananas(count) else:     pieces = 0  try:     smoothies = make_smoothies(pieces) except OutOfBananas:     out_of_stock()

這種寫法看上去稍微有點(diǎn)兒怪,因?yàn)閕f與else這兩個(gè)分支都給pieces變量定義了初始值。根據(jù)Python的作用域規(guī)則,這種分別定義變量初始值的寫法是成立的。雖說(shuō)成立,但這樣寫看起來(lái)比較別扭,所以很多人喜歡用第一種寫法,也就是在進(jìn)入if/else結(jié)構(gòu)之前,先把pieces的初始值給設(shè)置好。

改用海象操作符來(lái)實(shí)現(xiàn),可以少寫一行代碼,而且能夠壓低count變量的地位,讓它只出現(xiàn)在if塊里,這樣我們就能更清楚地意識(shí)到pieces變量才是整段代碼的重點(diǎn)。

pieces = 0 if (count := fresh_fruit.get('banana', 0)) >= 2:     pieces = slice_bananas(count)  try:     smoothies = make_smoothies(pieces) except OutOfBananas:     out_of_stock()

對(duì)于在if與else分支里面分別定義pieces變量的寫法來(lái)說(shuō),海象操作符也能讓代碼變得清晰,因?yàn)檫@次不用再把count變量放到整個(gè)if/else塊的上方了。

if (count := fresh_fruit.get('banana', 0)) >= 2:     pieces = slice_bananas(count) else:     pieces = 0  try:     smoothies = make_smoothies(pieces) except OutOfBananas:     out_of_stock()

Python新手經(jīng)常會(huì)遇到這樣一種困難,就是找不到好辦法來(lái)實(shí)現(xiàn)switch/case結(jié)構(gòu)。最接近這種結(jié)構(gòu)的做法是在if/else結(jié)構(gòu)里面繼續(xù)嵌套if/else結(jié)構(gòu),或者使用if/elif/else結(jié)構(gòu)。

例如,我們想按照一定的順序自動(dòng)給客人制作飲品,這樣就不用點(diǎn)餐了。下面這段邏輯先判斷能不能做香蕉冰沙,如果不能,就做蘋果汁,還不行,就做檸檬汁:

count = fresh_fruit.get('banana', 0) if count >= 2:     pieces = slice_bananas(count)     to_enjoy = make_smoothies(pieces) else:     count = fresh_fruit.get('apple', 0)     if count >= 4:         to_enjoy = make_cider(count)     else:         count = fresh_fruit.get('lemon', 0)         if count:             to_enjoy = make_lemonade(count)         else:             to_enjoy = 'Nothing'

這種難看的寫法其實(shí)在Python代碼里特別常見。幸好現(xiàn)在有了海象操作符,讓我們能夠輕松地模擬出很接近switch/case的方案。

if (count := fresh_fruit.get('banana', 0)) >= 2:     pieces = slice_bananas(count)     to_enjoy = make_smoothies(pieces) elif (count := fresh_fruit.get('apple', 0)) >= 4:     to_enjoy = make_cider(count) elif count := fresh_fruit.get('lemon', 0):     to_enjoy = make_lemonade(count) else:     to_enjoy = 'Nothing'

這個(gè)版本只比原來(lái)短五行,但是看起來(lái)卻清晰得多,因?yàn)榍短咨疃扰c縮進(jìn)層數(shù)都變少了。只要碰到剛才那種難看的結(jié)構(gòu),我們就應(yīng)該考慮能不能改用海象操作符來(lái)寫。

Python新手還會(huì)遇到一個(gè)困難,就是缺少do/while循環(huán)結(jié)構(gòu)。例如,我們要把新來(lái)的水果做成果汁并且裝到瓶子里面,直到水果用完為止。下面先用普通的while循環(huán)來(lái)實(shí)現(xiàn):

FRUIT_TO_PICK = [     {'apple': 1, 'banana': 3},     {'lemon': 2, 'lime': 5},     {'orange': 3, 'melon': 2}, ]  def pick_fruit():     if FRUIT_TO_PICK:         return FRUIT_TO_PICK.pop(0)     else:         return []  def make_juice(fruit, count):     return [(fruit, count)]  bottles = [] fresh_fruit = pick_fruit() while fresh_fruit:     for fruit, count in fresh_fruit.items():         batch = make_juice(fruit, count)         bottles.extend(batch)     fresh_fruit = pick_fruit()  print(bottles)

這種寫法必須把fresh_fruit =  pick_fruit()寫兩次,第一次是在進(jìn)入while循環(huán)之前,因?yàn)槲覀円ofresh_fruit設(shè)定初始值,第二次是在while循環(huán)體的末尾,因?yàn)槲覀兊冒严乱惠喰枰幚淼乃斜硖畛涞絝resh_fruit里面。

如果想復(fù)用這行代碼,可以考慮loop-and-a-half  模式。這個(gè)模式雖然能消除重復(fù),但是會(huì)讓while循環(huán)看起來(lái)很笨,因?yàn)樗闪藷o(wú)限循環(huán),程序只能通過(guò)break語(yǔ)句跳出這個(gè)循環(huán)。

FRUIT_TO_PICK = [     {'apple': 1, 'banana': 3},     {'lemon': 2, 'lime': 5},     {'orange': 3, 'melon': 2}, ]  bottles = [] while True:                     # Loop     fresh_fruit = pick_fruit()     if not fresh_fruit:         # And a half         break     for fruit, count in fresh_fruit.items():         batch = make_juice(fruit, count)         bottles.extend(batch)  print(bottles)

有了海象操作符,就不需要使用loop-and-a-half模式了,我們可以在每輪循環(huán)的開頭給fresh_fruit變量賦值,并根據(jù)變量的值來(lái)決定要不要繼續(xù)循環(huán)。這個(gè)寫法簡(jiǎn)單易讀,所以應(yīng)該成為首選方案。

FRUIT_TO_PICK = [     {'apple': 1, 'banana': 3},     {'lemon': 2, 'lime': 5},     {'orange': 3, 'melon': 2}, ]  bottles = [] while fresh_fruit := pick_fruit():     for fruit, count in fresh_fruit.items():         batch = make_juice(fruit, count)         bottles.extend(batch)  print(bottles)

在其他一些場(chǎng)合,賦值表達(dá)式也能縮減重復(fù)代碼??傊绻硞€(gè)表達(dá)式或賦值操作多次出現(xiàn)在一組代碼里面,那就可以考慮用賦值表達(dá)式把這段代碼改得簡(jiǎn)單一些。

要點(diǎn)

  • 賦值表達(dá)式通過(guò)海象操作符(:=)給變量賦值,并且讓這個(gè)值成為這條表達(dá)式的結(jié)果,于是,我們可以利用這項(xiàng)特性來(lái)縮減代碼。

  • 如果賦值表達(dá)式是大表達(dá)式里的一部分,就得用一對(duì)括號(hào)把它括起來(lái)。

  • 雖說(shuō)Python不支持switch/case與do/while結(jié)構(gòu),但可以利用賦值表達(dá)式清晰地模擬出這種邏輯。

以上就是Python中如何用海象操作符減少重復(fù)代碼,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:Python中如何用海象操作符減少重復(fù)代碼
當(dāng)前URL:http://www.dlmjj.cn/article/pippoo.html