ジェネレーターをループする方法


81

ジェネレーターをどのようにループできますか?私はこのように考えました:

gen = function_that_returns_a_generator(param1, param2)
if gen: # in case the generator is null
    while True:
        try:
            print gen.next()
        except StopIteration:
            break

もっとパイソン的な方法はありますか?


break;を使用することをお勧めします。ないcontinue
JonClements

ジェネレーターが要素に例外をスローする可能性があるが、反復を停止したくない場合は、実際にはこの方法で行います。
robbrit 2013年

回答:


145

単に

for x in gen:
    # whatever

トリックを行います。if gen常にを返すことに注意してくださいTrue


6
いいえ、if gen常に返されるわけではありませんTrue。オペアンプの場合はfunction_that_returns_a_generator()戻ってNonegenと評価さFalseif声明。
drevicko 2013年

44
@drevicko:私はそれfunction_that_returns_a_generator()がジェネレーターを返すと仮定していました(太字の仮定ですね)。 Noneジェネレータではありません。
Sven Marnach 2013年

、OPは「神託の道」を要求しているので、この答えは、Pythonが提唱していることを考えると、かなり合法的なようだEAFPを;-)
DerMike

17
for item in function_that_returns_a_generator(param1, param2):
    print item

関数から返されるものがあるかどうかを確認するためのテストについて心配する必要はありません。返されるものがないかのように、ループに入ることはありません。


9

副作用のみを気にするためにジェネレーターの出力が必要ない場合は、次のワンライナーを使用できます。

for _ in gen: pass

3
またはちょうどlist(gen)
aiven

7

あなたは単にそれをループすることができます:

>>> gen = (i for i in range(1, 4))
>>> for i in gen: print i
1
2
3

ただし、ループできるのは1回だけであることに注意してください。次回ジェネレーターは空になります:

>>> for i in gen: print i
>>> 

4

他の反復​​可能なものと同じように扱ってください。

for val in function_that_returns_a_generator(p1, p2):
    print val

これif gen:は常にTrueになるため、誤ったテストであることに注意してください


2

ジェネレーターを手動で移動する場合(つまり、各ループを手動で操作する場合)、次のようにすることができます。

    from pdb import set_trace

    for x in gen:
        set_trace()
        #do whatever you want with x at the command prompt
        #use pdb commands to step through each loop of the generator e.g., >>c #continue   

1
from pdb import set_trace#no():)
Vlad K.

1

他の答えは、複雑なシナリオに適しています。単にアイテムをリストにストリーミングしたい場合:

x = list(generator)

(または、ジェネレーターをトリガーして何かを実行したいだけの場合は、単にlist(generator)

単純な前処理には、リスト内包表記を使用します。

x = [tup[0] for tup in generator]

または、単純な関数を実行する場合:

# didn't assign to variable b/c we don't care about what the print() function returns
[print(x) for x in gen]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.