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