日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
耐人尋味的for...else...語(yǔ)句

老婆給當(dāng)程序員的老公打電話:“下班順路買(mǎi)一斤包子帶回來(lái),如果看到賣(mài)西瓜的,買(mǎi)一個(gè)?!碑?dāng)晚,程序員老公手捧一個(gè)包子進(jìn)了家門(mén)……老婆怒道:“你怎么就買(mǎi)了一個(gè)包子?”老公答曰:“因?yàn)榭吹搅速u(mài)西瓜的?!?/p>

程序員買(mǎi)西瓜的笑話可能大部分讀者都知道,今天寫(xiě)的這篇文章和這個(gè)笑話有一定的關(guān)系。

任何編程語(yǔ)言都提供了 if…else… 語(yǔ)句,表示如果(if)滿足條件就做某件事,否則(else)就做另外一件事:

 
 
 
  1. if a==b:
  2.     print("true")
  3. else:
  4.     print("false")

然而,在 Python 中 else 不僅可以和 if 搭配使用,另一種特有的句法是 for…else …,它還可以和 while、try…except 組合使用,例如:

 
 
 
  1. for i in range(3):
  2.     print(i)
  3. else:
  4.     print("end")
  5. >>>
  6. 0
  7. 1
  8. 2
  9. end

但是,你會(huì)發(fā)現(xiàn) for…else… 與 if…else… 表現(xiàn)得不一樣,按照以往經(jīng)驗(yàn)來(lái)說(shuō),執(zhí)行了 for 語(yǔ)句塊的代碼就不執(zhí)行 else 里面了,反之亦然。

然而,我們看到的卻恰恰相反,for 循環(huán)結(jié)束之后接著又執(zhí)行了 else 語(yǔ)句塊,這就有點(diǎn)意思了,if … else … 翻譯成大白話就是 如果…否則…,而 for…else… 翻譯成白話成了 直到… 然后 …,為什么不把它寫(xiě)成 for…then… 的句式呢?

for 循環(huán)遍歷空列表也會(huì)執(zhí)行 else 語(yǔ)句塊,因?yàn)樗钦M顺?for 循環(huán)的一種特例情況。

 
 
 
  1. for i in []:
  2.     print(i)
  3. else:
  4.     print("end")
  5. >>>
  6. 0

繼續(xù)探索,我們用 break 提前終止 for 循環(huán)

 
 
 
  1. for i in range(3):
  2.     print(i)
  3.     if i % 2 == 0:
  4.         break
  5. else:
  6.     print("end")
  7. >>>
  8. 0

循環(huán)遇到 break 退出后,整個(gè)語(yǔ)句就結(jié)束,else 語(yǔ)句塊也不執(zhí)行了。

綜上,我們可以得出這樣一個(gè)結(jié)論,只有當(dāng)循環(huán)里沒(méi)有遇到 break 時(shí),else 塊才會(huì)執(zhí)行。

Python 之父為什么要搞出這樣的一種語(yǔ)法糖出來(lái)呢?這是我們常人沒(méi)法理解的。不過(guò)「python之禪」告訴了我們答案: “Although that way may not be obvious at first unless you’re Dutch.”。

帶著這個(gè)問(wèn)題,我也在 StackOver Flow 找了一下答案,在平時(shí)的開(kāi)發(fā)中真的很少有 for…else… 的應(yīng)用場(chǎng)景,不過(guò),像下面這種場(chǎng)景用 for else 還真是一種 pythonic 的用法。

當(dāng)你用 for 循環(huán)迭代查找列表的中的某個(gè)元素時(shí),如果找到了就提前退出,如果迭代完了還沒(méi)找到需要以另外一種形式通知調(diào)用者時(shí),用 for else 無(wú)疑是***的選擇。

 
 
 
  1. for i in mylist:
  2.     if i == target:
  3.         break
  4.     process(i)
  5. else:
  6.     raise ValueError("List argument missing terminal flag.")

如果不用 for…else… , 那么還需要專(zhuān)門(mén)建立一個(gè)臨時(shí)標(biāo)記變量來(lái)標(biāo)記是否已經(jīng)找到了

 
 
 
  1. found = False
  2. for i in mylist:
  3.     if i == target:
  4.         found = True
  5.         break
  6.     process(i)
  7. if not found:
  8.     raise ValueError("List argument missing terminal flag.")

當(dāng)你想在房間里找某樣?xùn)|西時(shí),只要在任意位置找到了,就停止繼續(xù)搜查工作。但如果把整個(gè)房間都翻遍了,還沒(méi)找到我們想要的東西,需要告訴人家說(shuō):這兒沒(méi)有你要找的東西。遇到這樣的情況用 for … else ,除此之外,***不要用它。

【本文是專(zhuān)欄作者“劉志軍”的原創(chuàng)文章,作者微信公眾號(hào):Python之禪(VTtalk)】


網(wǎng)頁(yè)題目:耐人尋味的for...else...語(yǔ)句
鏈接URL:http://www.5511xx.com/article/dpejsps.html