在寫代碼過程中,定義局部變量操作頻率非常高。如果在一個函數中定義了太多的變量會讓程序不易維護且閱讀起來困難。
當我們在函數里面要定義變量時,而且這個變量要在函數里重復使用那么可以考慮使用海象賦值表達式減少創建變量。
賦值表達式是python3.8新引入的語法,他會用到海象操作符。這種寫法可以解決某些代碼重復的問題。a=b是一條普通的賦值語句,讀作a equals b;而a:=b則是賦值表達式,讀作a walrus b。這個符號為什么叫walrus?因為把:=
順時針旋轉90度后,冒號就像是海象的一雙眼睛,等號就是他的一對獠牙。
這種表達式很有用,可以在普通的賦值語句無法應用的場合實現賦值,例如用在if語句里面。賦值表達式的值,就是賦給海象操作符左側那個標識符的值。
2.1.海象表達式應用場景當我們需要定義一個局部變量時候,這個變量會被重復使用,這樣的場景可以考慮使用海象賦值表達式能夠讓代碼更緊湊,易讀宜維護。
1.用一個例子引出海象賦值表達式我們先來看一個簡單的制作果汁的例子,當顧客購買檸檬汁之前,先判斷有沒有足夠的檸檬可以榨汁。
# 水果的數量放在字典中
fresh_fruit = {'apple': 10,
'banana': 8,
'lemon': 5,
}
# 制作檸檬汁
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)
# 如果檸檬不為0則制作檸檬汁
if count:
make_lemonade(count)
else:
out_of_stock()
這段代碼看上去非常的簡單,但它不是好的代碼,結構松散,因為count變量雖然定義在了if語句機構上面,但是只有if語句才會用到它,else塊更本不需要使用這個變量。所以這種寫法會讓人誤以為count是個很重要的變量,if和else都要用到它,然而實際上并非如此。
我們的python開發過程中經常需要先獲取某個值,然后對她做判斷,在執行具體的邏輯。對于這種用法,我們需要先定義一個變量接收這個值,然后再操作這個變量,這樣的代碼總會創造出一些多余的變量。python引入賦值表達式就是為了解決這樣的問題。
2.海象賦值表達式優化代碼結構優化后的代碼雖然只省略了一行代碼,但讀起來結構卻清晰很多,這種寫法明確體現出count變量只與if語句有關。
這個賦值表達式先把:=
右邊的賦值給左邊的count變量,然后對自身求值。由于該語句緊跟著if語句,因此會判斷它的值決定是否進入if語句體。這種操作就是海象賦值表達式要表達的意思。
# 使用海象賦值表達式省去了定義count賦值語句。
if count := fresh_fruit.get('lemon', 0):
# 在if語句中可以使用海象表達式創建的變量
make_lemonade(count)
else:
out_of_stock()
3.海象賦值表達式增加運算規則上面的檸檬只需要一個就可以制作檸檬汁,如果客人點了蘋果汁,需要由4個蘋果才能制作。下面在程序中新增制作蘋果汁邏輯。
if (count := fresh_fruit.get('apple', 0)) >= 4:
make_cider(count)
else:
out_of_stock()
這次需要注意賦值表達式放在了一對括號里面,為什么那?因為我們要在if語句里面把這個表達式的結果和4做比較。剛才檸檬汁的例子沒有加括號,因為那時僅憑賦值表達式的值就能決定if/else的走向。
4.嵌套if/else語句中使用海象操作符優化代碼結構當判斷的條件多了之后,那么最常見的寫法就是使用if/else嵌套語句實現復雜的功能。但是隨著嵌套的層級變多后,定義的變量語句也會變多,代碼結構會比較混亂。因此我們可以使用海象賦值表達式來優化。
假如現在我們做一個自動制作果汁流程,首先判斷香蕉汁是否能做,如果不能就做蘋果汁,還不行就做檸檬汁。先來看下常規的if/else寫法
# 獲取香蕉數量,如果大于2則制作香蕉汁
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'
下面使用海象操作符優化上面的代碼
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'
優化后的代碼比原來的少了5行,但是看起來結構卻清晰的多,因為嵌套深度與縮進層次數都變少了。
只要碰到剛才難看的結構,就可以考慮使用海象操作符優化。
假如現在將所有的水果做成果汁放到瓶子里面,那么遍歷查看所有的水果并將他們全部制作成果汁。
下面的是常規的寫法,這種寫法必須把fresh_fruit = pick_fruit()
語句寫兩次,第一次是在while循環之前,因為我們要給fresh_fruit
設定初始值,第二次是在while循環體的末尾,因為我們得把下一輪需要處理的水果列表填充到fresh_fruit
里面
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 = []
# 運行while前,調用pick_fruit()函數獲取水果
fresh_fruit = pick_fruit()
# 遍歷水果對象,水果名稱:數量
while fresh_fruit:
for fruit, count in fresh_fruit.items():
batch = make_juice(fruit, count)
bottles.extend(batch)
# 運行while過程中,再次調用pick_fruit()函數獲取水果
fresh_fruit = pick_fruit()
print(f'制作好的果汁:{bottles}')
使用海象操作符可以優化后的代碼,while每次循環前都會獲取新的水果,如果有水果則開始循環,沒有則停止循環,實現了do-while循環模式。
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)
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站標題:海象賦值表達式減少重復變量-創新互聯
文章起源:http://m.newbst.com/article32/dioipc.html
成都網站建設公司_創新互聯,為您提供網站內鏈、Google、網站建設、虛擬主機、網站排名、移動網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯