2010-08-03 23 views
49

में जेनरेटर में आईएनजी मैं जानना चाहता हूं कि जब मैं जेनरेटर फ़ंक्शन के परिणाम को पायथन के एन्यूमरेट() में पास करता हूं तो क्या होता है। उदाहरण:enumerate() - पायथन

def veryBigHello(): 
    i = 0 
    while i < 10000000: 
     i += 1 
     yield "hello" 

numbered = enumerate(veryBigHello()) 
for i, word in numbered: 
    print i, word 

क्या गणित आलसी ढंग से पुनरावृत्त है, या क्या यह सब कुछ पहले में फिसल जाता है? मैं 99.9 99% निश्चित हूं कि यह आलसी है, तो क्या मैं इसे जेनरेटर फ़ंक्शन के समान ही मान सकता हूं, या मुझे कुछ भी देखने की ज़रूरत है?

+0

मुझे लगता है आप veryBigHello में मैं बढ़ाने के लिए मतलब है:

बेशक

, गणना वास्तव में सिर्फ एक फैंसी जनरेटर है। – robert

+0

@robert: अगर मैं गलत नहीं कर रहा हूं तो मैं स्वचालित रूप से –

+0

@the_drow को 'veryBigHello' फ़ंक्शन में नहीं बढ़ाता हूं। –

उत्तर

61

यह आलसी है।

>>> def abc(): 
...  letters = ['a','b','c'] 
...  for letter in letters: 
...   print letter 
...   yield letter 
... 
>>> numbered = enumerate(abc()) 
>>> for i, word in numbered: 
...  print i, word 
... 
a 
0 a 
b 
1 b 
c 
2 c 
+0

क्या यह पायथन 2 या 3 (या दोनों) है? क्या यह दोनों में आलसी है? मैंने पायथन 2 पर परीक्षण किया और यह * आलसी है। – becko

10

जब से तुम यह निश्चित रूप से स्मृति अपवाद से बाहर हो रही बिना इस समारोह कॉल कर सकते हैं आलसी

def veryBigHello(): 
    i = 0 
    while i < 1000000000000000000000000000: 
     yield "hello" 

numbered = enumerate(veryBigHello()) 
for i, word in numbered: 
    print i, word 
27

है यह पिछले दोनों में से किसी का सुझाव से बताने के लिए और भी आसान है: यह ऐसी बात है साबित करने के लिए काफी आसान है :

$ python 
Python 2.5.5 (r255:77872, Mar 15 2010, 00:43:13) 
[GCC 4.3.4 20090804 (release) 1] on cygwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> abc = (letter for letter in 'abc') 
>>> abc 
<generator object at 0x7ff29d8c> 
>>> numbered = enumerate(abc) 
>>> numbered 
<enumerate object at 0x7ff29e2c> 

की गणना आलसी मूल्यांकन प्रदर्शन नहीं किया था अगर यह वापसी होगी [(0,'a'), (1,'b'), (2,'c')] या कुछ (लगभग) बराबर।

def myenumerate(iterable): 
    count = 0 
    for _ in iterable: 
     yield (count, _) 
     count += 1 

for i, val in myenumerate((letter for letter in 'abc')): 
    print i, val 
+2

इस स्पष्टीकरण के लिए धन्यवाद। स्वीकार्य उत्तर को समझने में मुझे थोड़ा मुश्किल समय था। कम से कम जब तक मैंने तुम्हारा देखा नहीं। – trendsetter37

+1

यह स्वीकार्य उत्तर होना चाहिए – cowbert