生成されたアイテムを気にせずにジェネレーター関数を実行する必要があるユースケースがいくつかあります。
他のユースケースでは確かに生成された値が必要なので、それらを非汎用関数にすることはできません。
私は現在、発電機を使い果たすために些細な自作関数を使用しています。
def exhaust(generator):
for _ in generator:
pass
私はそれを行うためのより簡単な方法があるかどうか疑問に思いましたが、私はそれを見逃していますか?
次のユースケースを編集します。
def create_tables(fail_silently=True):
"""Create the respective tables."""
for model in MODELS:
try:
model.create_table(fail_silently=fail_silently)
except Exception:
yield (False, model)
else:
yield (True, model)
ある文脈では、私はエラーと成功の値を気にします…
for success, table in create_tables():
if success:
print('Creation of table {} succeeded.'.format(table))
else:
print('Creation of table {} failed.'.format(table), file=stderr)
…そして、関数を「盲目的に」実行したい場合もあります。
exhaust(create_tables())
このためのforループの設定は、Pythonのforループが基本的に単純な代入ステートメントの連続実行であることを念頭に置いて、比較的コストがかかる可能性があります。n(ジェネレーター内のアイテム数)の割り当てを実行しますが、後で割り当てターゲットを破棄するだけです。
代わりに、ジェネレーターを長さゼロにフィードすることができdeque
ます。C速度で消費し、list
イテレータ/ジェネレータを実体化する他の呼び出し可能オブジェクトのようにメモリを消費しません。
from collections import deque
def exhaust(generator):
deque(generator, maxlen=0)
consume
itertoolsレシピから取得。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加