在Python中,可以在if之后,也可以在for和while循环之后编写else。只有当循环以“正常”方式结束时,也就是没有使用break时,才会执行else的主体。这使得例如实现元素的搜索变得优雅。
示例:
for x in range(5): if x == 3: print('break!') break else: print('循环在没有break的情况下结束') # 不会被执行
for x in range(5): if x == 10: break else: print('循环在没有break的情况下结束') # 会被执行
这个特性常用于“无果搜索”:如果没有发生break,则表示未找到元素。
循环结束时,else块是否总会被执行?如果循环是空的呢?
回答: 是的,如果没有break,else总会被执行,即使循环从未进入身体:
for x in []: print('什么也没有') else: print('else!') # 这将被输出
故事
项目: 文档解析器。
问题: 在列表中寻找键,循环结束后在else外设置“未找到”标志。因此,如果没有发生break,元素发现的工作不正确。
故事
项目: 生成唯一令牌。
问题: 令牌生成的逻辑依赖于正确的break退出,而else错误地被认为是“特殊情况”,虽然实际上99%的运行中都会触发,导致用户授权逻辑中断。
故事
项目: 网络API测试脚本。
问题: 因为对while后else的错误理解,我们将其用于处理超时,尽管循环并不是因为break结束,导致没有捕获到超时,进而在测试中出现“安静”的错误。