क्या Python 3 में जेनरेटर.नेक्स्ट () दिखाई दे रहा है?


247

मेरे पास एक जनरेटर है जो एक श्रृंखला बनाता है, उदाहरण के लिए:

def triangle_nums():
    '''Generates a series of triangle numbers'''
    tn = 0
    counter = 1
    while True:
        tn += counter
        yield tn
        counter += + 1

पायथन 2 में मैं निम्नलिखित कॉल करने में सक्षम हूं:

g = triangle_nums()  # get the generator
g.next()             # get the next value

हालाँकि पायथन 3 में यदि मैं कोड की समान दो पंक्तियों को निष्पादित करता हूँ तो मुझे निम्नलिखित त्रुटि मिलती है:

AttributeError: 'generator' object has no attribute 'next'

लेकिन, लूप इटरेटर सिंटैक्स पायथन 3 में काम करता है

for n in triangle_nums():
    if not exit_cond:
       do_something()...

मुझे अभी तक कुछ भी नहीं मिल पाया है जो पायथन 3 के लिए व्यवहार में यह अंतर बताता है।

जवाबों:


406

g.next()का नाम बदल दिया गया है g.__next__()। इसका कारण स्थिरता है: विशेष तरीके जैसे __init__()और __del__()सभी में डबल अंडरस्कोर (या वर्तमान वर्नाक्यूलर में "डंडर") है, और .next()उस नियम के कुछ अपवादों में से एक था। यह पायथन 3.0 में तय किया गया था। [*]

लेकिन कॉल करने के बजाय g.__next__(), उपयोग करें next(g)।

[*] इस फिक्स को प्राप्त करने वाले अन्य विशेष गुण हैं; func_name, अब है __name__, आदि।


किसी भी विचार क्यों अजगर 2 पहले स्थान पर इन तरीकों के लिए डंडे सम्मेलन में भाग लिया?
— रिक

वह शायद सिर्फ एक निरीक्षण है।
— लेन्आर्ट रेग्रोब

जब आप कक्षाओं में __ str __ को ओवरराइट करते हैं तो क्या होगा? क्या यह str (obj) या __str __ (obj) बदलता है?
— NoName

@ नोनाम ऐसा कोई मामला नहीं है __str__(obj), इसलिए मैं वास्तव में इस सवाल को नहीं समझता।
— लेन्नर्ट रेगेब्रॉ

1
@NoName हाँ, आप करते हैं।
— लेन्नर्ट रेगेब्र

144

प्रयत्न:

next(g)

की जाँच करें इस स्वच्छ तालिका कि शो 2 और 3 के बीच वाक्य रचना में मतभेद है जब यह यह करने के लिए आता है।


1
@MaikuMori मैंने लिंक तय किया (सहकर्मी संशोधन की प्रतीक्षा कर रहा है) (साइट diveintopython3.org नीचे लगती है। मिरर साइट diveintopython3.ep.io अभी भी जीवित है)
— gecco

1
फिर से लिंक फिक्स्ड। python3porting.com/differences.html अधिक पूर्ण, btw है।
— लेन्नर्ट रेगेब्र जूल 27'13

क्या किसी विधि से किसी फ़ंक्शन पर स्विच करने का कोई औचित्य है, इससे परे g.next()वास्तव में होना चाहिए g.__next__(), और हमें कुछ ऐसा करने की आवश्यकता है जो कार्यक्षमता के साथ एक डंडर विधि नहीं है g.next()?
— टीसी प्रॉक्टर

11

यदि आपका कोड Python2 और Python3 के तहत चलना चाहिए, तो इस तरह 2to3 छह लाइब्रेरी का उपयोग करें:

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'

18
जब तक आपको 2.6 से पहले पायथन संस्करणों का समर्थन करने की आवश्यकता नहीं है, तब तक इसके लिए बहुत अधिक आवश्यकता नहीं है। पायथन 2.6 और 2.7 में nextअंतर्निहित फ़ंक्शन हैं।
— मार्क डिकिंसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.