最佳答案
我想知道在 Python 内置函数中没有 first(iterable)
是否有原因,这有点类似于 any(iterable)
和 all(iterable)
(它可能藏在某个 stdlib 模块中,但我在 itertools
中没有看到)。first
将执行短路发生器评估,以避免不必要的(和潜在的无限数量的)操作;。
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]
和正匹配上的短路,可以节省大量不必要的处理。