enumerate () - पाइथन में एक जेनरेटर लगाते हैं


90

मैं जानना चाहता हूं कि जब मैं जेनरेटर फ़ंक्शन के परिणाम को अजगर के प्रगणक () में पास करता हूं तो क्या होता है। उदाहरण:

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

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

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


1
मुझे लगता है कि तुम मुझे बहुत BigHello में वेतन वृद्धि का मतलब है।
रॉबर्ट

@ एरोबर्ट: अगर मैं गलत नहीं हूँ तो मैं स्वतः बढ़ जाता हूँ
the_drow

@the_drow veryBigHelloफ़ंक्शन में ही नहीं।
विल मैकचेन

1
@Ill: ओह, सही है। लेकिन यह सिर्फ नाइटपैकिंग है। इसका उदाहरण है। वैसे भी तय हो गया।
the_drow

जवाबों:


108

यह आलसी है। यह साबित करना काफी आसान है कि यह मामला है:

>>> 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

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

2
मैंने पायथन 3.5.2 पर इसका परीक्षण किया, और यह आलसी का मूल्यांकन करता है।
गॉबर्नाडोर

42

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

$ 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
इस स्पष्टीकरण के लिए धन्यवाद। मुझे स्वीकार किए गए उत्तर का पता लगाने में थोड़ा मुश्किल समय था। कम से कम जब तक मैंने तुम्हारा देखा।
ट्रेंडसेटर

13

चूंकि आप इस फ़ंक्शन को मेमोरी अपवादों से बाहर निकले बिना कह सकते हैं, यह निश्चित रूप से आलसी है

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

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

0

पुराने स्कूल के विकल्प के बाद से मैं एक जनरेटर का उपयोग कर रहा था कि किसी और (स्केलेरन) ने लिखा कि यहां दृष्टिकोण के साथ काम नहीं किया।

i=(-1)
for x in some_generator:
    i+=1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.