91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-10-09 17:21:27 來源:億速云 閱讀:154 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關Python中如何用海象操作符減少重復代碼,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

a = b是一條普通的賦值語句,讀作a equals b,而a := b則是賦值表達式,讀作a walrus b。這個符號為什么叫walrus呢?因為把:=順時針旋轉90°之后,冒號就是海象的一雙眼睛,等號就是它的一對獠牙。

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

這種表達式很有用,可以在普通的賦值語句無法應用的場合實現賦值,例如可以用在條件表達式的if語句里面。賦值表達式的值,就是賦給海象操作符左側那個標識符的值。

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

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

顧客點檸檬汁之前,我們先得確認現在還有沒有檸檬可以榨汁。所以,要先查出檸檬的數量,然后用if語句判斷它是不是非零的值。

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()

這段代碼看上去雖然簡單,但還是顯得有點兒松散,因為count變量雖然定義在整個if/else結構之上,然而只有if語句才會用到它,else塊根本就不需要使用這個變量。所以,這種寫法讓人誤以為count是個重要的變量,if和else都要用到它,但實際上并非如此。

我們在Python里面經常要先獲取某個值,然后判斷它是否非零,如果是就執行某段代碼。對于這種用法,我們以前總是要通過各種技巧,來避免count這樣的變量重復出現在代碼之中,這些技巧有時會讓代碼變得比較難懂。Python引入賦值表達式正是為了解決這樣的問題。下面改用海象操作符來寫:

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

新代碼雖然只省了一行,但讀起來卻清晰很多,因為這種寫法明確體現出count變量只與if塊有關。這個賦值表達式先把:=右邊的值賦給左邊的count變量,然后對自身求值,也就是把變量的值當成整個表達式的值。

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

檸檬汁效力強,所以只需要一顆檸檬就能做完這份訂單,這意味著程序只需判斷非零即可。如果客人點的是蘋果汁,那就至少得用四個蘋果才行。按照傳統的寫法,要先從fresh_fruit這個字典里面查出蘋果(apple)的數量(count),然后在if語句里,根據這個數量構造條件表達式(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()

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

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

與剛才那個例子一樣,修改之后的代碼也比原來少了一行。但是這次,我們還要注意另外一個現象:賦值表達式本身是放在一對括號里面的。為什么要這樣做呢?因為我們要在if語句里面把這個表達式的結果跟4這個值相比較。

剛才檸檬汁的例子沒有加括號,因為那時只憑賦值表達式本身的值就能決定if/else的走向:只要表達式的值不是0,程序就進入if分支。但是這次不行,這次要把這個賦值表達式放在更大的表達式里面,所以必須用括號把它括起來。當然,在沒有必要加括號的情況下,還是盡量別加括號比較好。

還有一種類似的邏輯也會出現剛才說的重復代碼,這指的是:我們要根據情況給某個變量賦予不同的值,緊接著要用這個變量做參數來調用某個函數。

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

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()

還有一種傳統的寫法也很常見,就是把if/else結構上方那條pieces = 0的賦值語句移動到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()

這種寫法看上去稍微有點兒怪,因為if與else這兩個分支都給pieces變量定義了初始值。根據Python的作用域規則,這種分別定義變量初始值的寫法是成立的。雖說成立,但這樣寫看起來比較別扭,所以很多人喜歡用第一種寫法,也就是在進入if/else結構之前,先把pieces的初始值給設置好。

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

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

對于在if與else分支里面分別定義pieces變量的寫法來說,海象操作符也能讓代碼變得清晰,因為這次不用再把count變量放到整個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新手經常會遇到這樣一種困難,就是找不到好辦法來實現switch/case結構。最接近這種結構的做法是在if/else結構里面繼續嵌套if/else結構,或者使用if/elif/else結構。

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

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'

這種難看的寫法其實在Python代碼里特別常見。幸好現在有了海象操作符,讓我們能夠輕松地模擬出很接近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'

這個版本只比原來短五行,但是看起來卻清晰得多,因為嵌套深度與縮進層數都變少了。只要碰到剛才那種難看的結構,我們就應該考慮能不能改用海象操作符來寫。

Python新手還會遇到一個困難,就是缺少do/while循環結構。例如,我們要把新來的水果做成果汁并且裝到瓶子里面,直到水果用完為止。下面先用普通的while循環來實現:

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()寫兩次,第一次是在進入while循環之前,因為我們要給fresh_fruit設定初始值,第二次是在while循環體的末尾,因為我們得把下一輪需要處理的水果列表填充到fresh_fruit里面。

如果想復用這行代碼,可以考慮loop-and-a-half  模式。這個模式雖然能消除重復,但是會讓while循環看起來很笨,因為它成了無限循環,程序只能通過break語句跳出這個循環。

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模式了,我們可以在每輪循環的開頭給fresh_fruit變量賦值,并根據變量的值來決定要不要繼續循環。這個寫法簡單易讀,所以應該成為首選方案。

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)

在其他一些場合,賦值表達式也能縮減重復代碼。總之,如果某個表達式或賦值操作多次出現在一組代碼里面,那就可以考慮用賦值表達式把這段代碼改得簡單一些。

要點

  • 賦值表達式通過海象操作符(:=)給變量賦值,并且讓這個值成為這條表達式的結果,于是,我們可以利用這項特性來縮減代碼。

  • 如果賦值表達式是大表達式里的一部分,就得用一對括號把它括起來。

  • 雖說Python不支持switch/case與do/while結構,但可以利用賦值表達式清晰地模擬出這種邏輯。

以上就是Python中如何用海象操作符減少重復代碼,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤岗市| 射洪县| 九寨沟县| 岚皋县| 柳林县| 资溪县| 炉霍县| 南丹县| 巴南区| 滁州市| 泰安市| 五原县| 府谷县| 淮滨县| 肃宁县| 宁陕县| 松江区| 连州市| 松原市| 什邡市| 阿尔山市| 武隆县| 临夏市| 金坛市| 年辖:市辖区| 河北省| 蒙自县| 祁连县| 娱乐| 新津县| 兴山县| 宝应县| 莆田市| 亳州市| 成安县| 宜兰县| 东兴市| 武鸣县| 东海县| 江华| 泌阳县|