Python, for-else, while-else是否造成了语义歧义 ( 增加心智负担 )?
问题描述
看到用了 for-else/while-else的代码, 往往不能马上搞懂 else 处代码的意思
因为, 脑袋不能马上反应, else 到底表示了什么样的语义( 还需要转几个弯 )
(但是 try - except -else 没有带来语义上的歧义)
相关代码能否一眼辨别出, 什么时候, 什么条件下 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):breakelse: # raise error or do additional processing
问题解答
回答1:题主认为语义不明是可以理解的。毕竟其他语言中的 else 只跟 if 搭配,更何况这里的 else 并不符合自然语义。
在自然语义下,else 有 '其它的' 的意思,但对 for, while, try 型 else,用 '除了以上程序考虑到的情况' 来解释此子句并不合理。私以为理解成 '主块正常结束后的情况' 更为正确——所谓主块,即 else 附属的 循环体 或 try 子句; 所谓正常,即不通过特殊手段中止控制流(异常 或 循环中的 break)。
这么理解可能更清晰些。
回答2:我喜欢这个例子:
n = 17for d in range(2,n): if n % d == 0:print(n, ’是合数’)breakelse: print(n, ’是素数’)
没有else的话我们应该加个bool变量,for循环后还加个if/else。用for/else的话简单多了。你慢慢会熟悉;-)
回答3:没有歧义,你不习惯而已。
回答4:Fluent Python的作者认为是会增加的,他这样说到: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.
相关文章:
1. python的MySQLdb库中的executemany方法如何改变默认加上的单引号?2. python爬虫 - scrapy使用redis的时候,redis需要进行一些设置吗?3. 网页爬虫 - python requests爬虫,如何post payload4. python 读取csv文件可以读取但内容错误,但单独用excel打开正常,如何解决?5. 请教,关于python字典,合并相同值的键的实现方法6. python - 如何用pandas处理分钟数据变成小时线?7. python - 怎么查看网址做的是什么反爬虫8. python - Django表单Form.save()问题9. python3.x - python 中的maketrans在utf-8文件中该怎么使用10. python3.x - python连oanda的模拟交易api获取json问题第五问

网公网安备