リスト内包表記/ジェネレータ式でif
とfor
を次のように使用できます。
list(i for i in range(100) if i*i < 30)
これが最も効率的ではないことはわかっていますが、条件がはるかに複雑になる可能性があるため、これは単なる例です。ただし、これはまだ100回の反復を経て、最初の6でのみ値を生成します。次のようなもので停止する場所をジェネレータ式に指示する方法はありますか。
list(i for i in range(100) while i*i < 30)
ただし、while
はジェネレータ式では理解されません。したがって、私の質問は、新しい値が生成されなくても計算を続行しないように、停止条件を使用してジェネレータ式を作成するにはどうすればよいかということです。
itertools
(takewhile()
が頭に浮かぶ)のさまざまな関数が役立ちます。
takewhile()
とdropwhile()
の構文はclearestではないため、ここに実際の質問の例を示します。 :
>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))]
[0, 1, 2, 3, 4, 5]
>>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))]
[6, 7, 8, 9]
Itertoolsの作者が 質問した これらの関数を非推奨にするかどうかを知ってください。