首頁  >  問答  >  主體

Python, for-else, while-else是否造成了语义歧义 ( 增加心智负担 )?

看到用了 for-else/while-else的代码, 往往不能马上搞懂 else 处代码的意思

因为, 脑袋不能马上反应, else 到底表示了什么样的语义( 还需要转几个弯 )

(但是 try - except -else 没有带来语义上的歧义)

相关代码

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):
        break
else:
    # raise error or do additional processing 
PHP中文网PHP中文网2741 天前681

全部回覆(4)我來回復

  • 巴扎黑

    巴扎黑2017-04-18 10:30:27

    題主認為語意不明是可以理解的。畢竟其他語言的 else 只跟 if 搭配,更何況這裡的 else 並不符合自然語意。

    在自然語義下,else 有 "其它的" 的意思,但對 for, while, try 型 else,用 "除了以上程序考慮到的情況" 來解釋此子句並不合理。私以為理解成"主塊正常結束後的情況" 更為正確-所謂主塊,即else 附屬的循環體或try 子句; 所謂正常,即不通過特殊手段中止控制流(異常或循環中的break)。

    這麼理解可能更清晰些。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:30:27

    我喜歡這個例子:

    n = 17
    for d in range(2,n):
        if n % d == 0:
            print(n, '是合数')
            break
    else:
        print(n, '是素数')

    沒有else的話我們應該加個bool變量,for迴圈後還要加個if/else。用for/else的話簡單多了。你慢慢會熟悉;-)

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 10:30:27

    沒有歧義,你不習慣而已。

    回覆
    0
  • PHPz

    PHPz2017-04-18 10:30:27

    Fluent Python 的作者認為是會增加的,他是這樣說的:我認為除了 if 之外,在所有情況下 else 都是一個非常糟糕的關鍵字選擇。它意味著一種排除選擇,例如“運行這個循環,否則執行那個操作”,但循環中 else 的語義是相反的:“運行這個循環,然後執行那個操作”。這表明then 作為一個更好的關鍵字——這在try 上下文中也有意義:「嘗試這個,然後做那個。」然而,添加新關鍵字對語言來說是一個重大改變,Guido 像躲避瘟疫一樣避免它。

    回覆
    0
  • 取消回覆