Python, for-else, while-else是否造成了語(yǔ)義歧義 ( 增加心智負(fù)擔(dān) )?
問(wèn)題描述
看到用了 for-else/while-else的代碼, 往往不能馬上搞懂 else 處代碼的意思
因?yàn)? 腦袋不能馬上反應(yīng), else 到底表示了什么樣的語(yǔ)義( 還需要轉(zhuǎn)幾個(gè)彎 )
(但是 try - except -else 沒(méi)有帶來(lái)語(yǔ)義上的歧義)
相關(guān)代碼能否一眼辨別出, 什么時(shí)候, 什么條件下 else處代碼會(huì)執(zhí)行?
for i in range(5):... print(i)... else:... print(’Iterated over everything :)’)for i in range(5):... if i == 2:... break... print(i)... else:... print(’Iterated over everything :)’)for i in []:... print(i)... else:... print(’Still iterated over everything (i.e. nothing)’)> i = 0>>> while i <= 5:... i += 1... print i... else:... print ’Yep’for x in data: if meets_condition(x):breakelse: # raise error or do additional processing
問(wèn)題解答
回答1:題主認(rèn)為語(yǔ)義不明是可以理解的。畢竟其他語(yǔ)言中的 else 只跟 if 搭配,更何況這里的 else 并不符合自然語(yǔ)義。
在自然語(yǔ)義下,else 有 '其它的' 的意思,但對(duì) for, while, try 型 else,用 '除了以上程序考慮到的情況' 來(lái)解釋此子句并不合理。私以為理解成 '主塊正常結(jié)束后的情況' 更為正確——所謂主塊,即 else 附屬的 循環(huán)體 或 try 子句; 所謂正常,即不通過(guò)特殊手段中止控制流(異常 或 循環(huán)中的 break)。
這么理解可能更清晰些。
回答2:我喜歡這個(gè)例子:
n = 17for d in range(2,n): if n % d == 0:print(n, ’是合數(shù)’)breakelse: print(n, ’是素?cái)?shù)’)
沒(méi)有else的話(huà)我們應(yīng)該加個(gè)bool變量,for循環(huán)后還加個(gè)if/else。用for/else的話(huà)簡(jiǎn)單多了。你慢慢會(huì)熟悉;-)
回答3:沒(méi)有歧義,你不習(xí)慣而已。
回答4:Fluent Python的作者認(rèn)為是會(huì)增加的,他這樣說(shuō)到:I think else is a very poor choice for the keyword in all cases except if. It implies an excluding alternative, like “Run this loop, other‐ wise do that”, but the semantics for else in loops is the opposite: “Run this loop, then do that”. This suggests then as a better keyword — which would also make sense in the try context: “Try this, then do that.” However, adding a new keyword is a breaking change to the language, and Guido avoids it like the plague.
相關(guān)文章:
1. python - django的model字段在保存的時(shí)候做預(yù)處理怎么辦?2. 編程 - 如何把python程序變成網(wǎng)站3. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?4. python - 怎么查看網(wǎng)址做的是什么反爬蟲(chóng)5. python sqlite3 長(zhǎng)語(yǔ)句插入出錯(cuò)6. python - 網(wǎng)站顯示的圖片與爬蟲(chóng)獲取到的圖片不同,應(yīng)該如何確定問(wèn)題?7. python - xpath提取網(wǎng)頁(yè)路徑?jīng)]問(wèn)題,但是缺失內(nèi)容?8. python中def定義的函數(shù)加括號(hào)和不加括號(hào)的區(qū)別?9. 新手 - Python 爬蟲(chóng) 問(wèn)題 求助10. Python中使用超長(zhǎng)的List導(dǎo)致內(nèi)存占用過(guò)大

網(wǎng)公網(wǎng)安備