क्या 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.