我想知道是否有某种原因,first(iterable)
Python内置函数中没有这个原因,它与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]
正向匹配并使其短路,可以节省许多不必要的处理。