Python 的 for
和 while
循环提供了一个独特的 else
子句。这个子句只有在循环没有因 break
语句而提前结束时才会执行。
循环中使用 else
子句的例子
在下面的 contains
函数中,else
子句用来处理在循环中没有找到指定元素的情况:
def contains(haystack, needle):
"""
Throw a ValueError if `needle` not in `haystack`.
"""
for item in haystack:
if item == needle:
break
else:
# The `else` here is a "completion clause" that runs
# only if the loop ran to completion without hitting
# a `break` statement.
raise ValueError('Needle not found')
使用示例
>>> contains([23, 'needle', 0xbadc0ffee], 'needle')
None
>>> contains([23, 42, 0xbadc0ffee], 'needle')
ValueError: "Needle not found"
更清晰的替代方法
尽管在循环中使用 else
子句是有效的,但它可能会导致代码阅读上的混淆。以下是一个更直观的替代方法:
def better_contains(haystack, needle):
for item in haystack:
if item == needle:
return
raise ValueError('Needle not found')
Pythonic 的成员检查方式
在 Python 中,进行成员检查的更常见(也更推荐)的方式是直接使用 in
关键字:
if needle not in haystack:
raise ValueError('Needle not found')
评论区