अजगर 3 में एक उपज जनरेटर में कोई अगला () फ़ंक्शन नहीं है


84

में इस सवाल का , मैं अजगर जनरेटर का उपयोग एक अंतहीन अनुक्रम है। लेकिन पायथन 3 में समान कोड काम नहीं करता है क्योंकि ऐसा लगता है कि कोई next()फ़ंक्शन नहीं है। nextफ़ंक्शन के लिए समकक्ष क्या है ?

def updown(n):
    while True:
        for i in range(n):
            yield i
        for i in range(n - 2, 0, -1):
            yield i

uptofive = updown(6)
for i in range(20):
    print(uptofive.next())


यह कोड कैसे काम करता है? मुझे लगता है कि यह काम करता है, लेकिन मैंने जो भी पढ़ा है, "उपज के बयान पर पहुंचने पर कोड का निष्पादन बंद हो जाता है"। ( python-course.eu/python3_generators.php )। तो पहले में for i in range(n), yieldबस "1" वापस क्यों नहीं आता ? इसके बजाय, रेंज में पहले मूल्य के बाद, कोड जारी रहता है, और पूरी रेंज को पैदावार देता है, जो मुझे लगता है कि उपज को एक साथ कई बार कहा जाता है। मुझे बारीकियों को समझने में थोड़ी परेशानी हो रही है।
— माइक एस

पहली बार forआपके फ़ंक्शन से निर्मित जनरेटर ऑब्जेक्ट को कॉल करता है, यह आपके फ़ंक्शन में कोड को शुरुआत से चलाएगा जब तक कि यह हिट नहीं हो जाता है yield, तब यह लूप के पहले मूल्य को वापस कर देगा। फिर, एक-दूसरे कॉल फंक्शन में आपके द्वारा लिखे गए लूप को एक और बार चलाएंगे, और अगले मूल्य को वापस करेंगे, जब तक कि लौटने के लिए कोई मूल्य नहीं है। ( इस ट्यूटोरियल से लिया गया )
— मटिया पैटरना

जवाबों:



44

पायथन 3 में, वाक्यविन्यास को अधिक सुसंगत बनाने के लिए, next()विधि का नाम बदल दिया गया __next__()। आप उस एक का उपयोग कर सकते हैं। यह PEP 3114 में समझाया गया है ।

ग्रेग के समाधान और अंतर्निहित next()फ़ंक्शन को कॉल करने के बाद (जो तब किसी ऑब्जेक्ट की __next__()विधि खोजने की कोशिश करता है ) की सिफारिश की जाती है।


1
विशेष रूप से चूंकि फ़ंक्शन संस्करण 2 और 3 के बीच पोर्टेबल है, जबकि विधियां (नाम परिवर्तन के कारण) नहीं हैं।
— होल्डनवेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.