Python 組み込み関数にandfirst(iterable)
に似たものがない理由があるかどうか疑問に思っています (stdlib モジュールのどこかに隠れている可能性がありますが、 には表示されません)。短絡発生器の評価を実行して、不必要な(そして潜在的に無限の数の)操作を回避できるようにします。すなわちany(iterable)
all(iterable)
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]
肯定的な一致を回避して短絡することで、不要な処理を大幅に節約できます。