2012-07-18 17 views
49

के माध्यम से लूप कैसे करें जनरेटर के माध्यम से एक लूप कैसे कर सकता है? मैंने इस तरह से सोचा:जेनरेटर

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 

क्या कोई और पाइथोनिक तरीका है?

+0

मैं 'ब्रेक 'का उपयोग करने का सुझाव दूंगा; 'जारी रखें' –

+0

मैं वास्तव में इस मामले में ऐसा करूँगा जहां जनरेटर तत्व पर अपवाद फेंक सकता है, लेकिन आप पुनरावृत्ति को रोकना नहीं चाहते हैं। – robbrit

उत्तर

96

सीधे शब्दों में

for x in gen: 
    # whatever 

चाल करेंगे। ध्यान दें कि if gen हमेशा True देता है।

+5

नहीं, 'यदि gen' हमेशा' True' नहीं लौटाता है। यदि ओप का 'function_that_returns_a_generator() '' कोई नहीं' देता है, 'gen' 'if' कथन में' गलत 'का मूल्यांकन करता है। – drevicko

+27

@ ड्रेविको: मैं मान रहा था कि 'function_that_returns_a_generator()' जनरेटर लौटाता है (बोल्ड धारणा, है ना?)। 'कोई नहीं' जनरेटर नहीं है। –

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

आप परीक्षण के बारे में चिंता करने के लिए अगर वहाँ कुछ भी नहीं है जैसे कुछ भी नहीं लौटे आप पाश में प्रवेश नहीं करेगा अपने कार्य द्वारा दिया जा रहा है, यह देखने की जरूरत नहीं है।

4

बस किसी भी अन्य iterable है जैसे कि यह इलाज:,

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

ध्यान दें कि if gen: हमेशा सच हो जाएगा तो यह एक झूठी परीक्षण

0

है आप मैन्युअल रूप से जनरेटर के माध्यम से ले जाना चाहते हैं (यानी, काम करने के लिए मैन्युअल रूप से प्रत्येक पाश के साथ) तो आप कुछ इस तरह कर सकता है:

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 
5

मामले में आप जनरेटर के उत्पादन की जरूरत नहीं है, क्योंकि आप अपने पक्ष के बारे में केवल परवाह

for _ in gen: pass 
3

आप इसे माध्यम से बस पाश कर सकते हैं:: है कि आप केवल पाश एक बार कर सकते हैं,

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

लेकिन बारे में पता होना प्रभाव, तो आपको निम्न एक लाइनर का उपयोग कर सकते हैं। अगली बार जेनरेटर खाली होगा:

>>> for i in gen: print i 
>>> 
संबंधित मुद्दे