2014-04-11 6 views
5

मुझे हमेशा बताया जाता है कि enumerate बिल्ट-इन का उपयोग तब किया जा सकता है जब आपको संख्या को गिनने और एक ही समय में पुनरावृत्ति की आवश्यकता होती है।जनरेटर को पुन: सक्रिय करते समय कुल संख्या गिनने का सही तरीका क्या है?

उदाहरण के लिए इस अजगर में एक आम मुहावरा (समारोह gen एक जनरेटर रिटर्न) है:

for index, item in enumerate(gen()): 
    # Do something with item 

# get the numbers consumed from generator 
print("% number of items processed" % (index+1,)) 

लेकिन जनरेटर कुछ भी नहीं देता है तो क्या होगा? जैसे enumerate(range(0)), index चर को अपरिभाषित किया जाएगा।

हम लूप के पहले index चर परिभाषित कर सकते हैं, लेकिन क्या कोई और पाइथनिक समाधान है जिसे मैं नहीं जानता था?

+3

। –

उत्तर

5

enumerate(gen(), start=1)indexindex+1 की आवश्यकता को हटाने के लिए 1 से गिनती शुरू कर देगा। अन्यथा, मुझे लगता है कि आपके पास पहले से ही पाइथोनिक है।

index = 0 
for index, item in enumerate(gen(), start=1): 
    # Do something with item 

print("%d number of items processed" % (index,)) 
+0

आप 'इंडेक्स = -1', ड्रॉप' स्टार्ट = 1', और प्रिंट '(इंडेक्स + 1,)' का उपयोग कर सकते हैं, यदि लूप के अंदर 'इंडेक्स' की आवश्यकता है – jfs

1

आप फिर से index उपयोग करने के लिए इच्छुक रहे हैं, तो बस इसे अपने for पाश ऊपर प्रारंभ की तरह आप ने कहा। इसके बारे में "un-Pythonic" कुछ भी नहीं है।

आप यकीन है कि अगर index परिभाषित किया जाएगा, तो आप हमेशा उपयोग कर सकते हैं की कोशिश/छोड़कर नहीं कर रहे हैं: मुझे यकीन है कि क्या हो रहा है इसलिए गैर-pythonic एक चर है कि आप बाद में उपयोग करने के लिए इच्छुक रहे हैं आरंभ के बारे में नहीं हूँ

>>> from __future__ import print_function # for Python 2 compatibility 
>>> import sys 
>>> 
>>> for i, j in enumerate(range(0)): 
... pass 
... 
>>> try: 
... print(i) 
... except NameError: 
... print('i was not defined', file=sys.stderr) 
... 
i was not defined 
संबंधित मुद्दे

 संबंधित मुद्दे