首页  >  问答  >  正文

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 天前683

全部回复(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
  • 取消回复