我想知道first(iterable)
Python 内置函数中是否有 no 的原因,有点类似于any(iterable)
and all(iterable)
(它可能隐藏在某个 stdlib 模块中,但我没有在 中看到它itertools
)。first
将执行短路生成器评估,从而可以避免不必要的(并且可能是无限数量的)操作;IE
def identity(item):
return item
def first(iterable, predicate=identity):
for item in iterable:
if predicate(item):
return item
raise ValueError('No satisfactory value found')
通过这种方式,您可以表达以下内容:
denominators = (2, 3, 4, 5)
lcd = first(i for i in itertools.count(1)
if all(i % denominators == 0 for denominator in denominators))
显然,在这种情况下你不能这样做list(generator)[0]
,因为生成器不会终止。
或者,如果您有一堆正则表达式要匹配(当它们都具有相同的groupdict
界面时很有用):
match = first(regex.match(big_text) for regex in regexes)
list(generator)[0]
通过避免和短路正匹配,您可以节省大量不必要的处理。