2012-05-02 29 views
23

पायथन 2.6 ने next फ़ंक्शन पेश किया।पायथन: मुझे अगले() और obj.next() क्यों नहीं उपयोग करना चाहिए?

यह आवश्यक क्यों था? next(obj) के बजाय हमेशा obj.next() टाइप कर सकता है।

उत्तरार्द्ध pythonic है?

+5

मैंने हमेशा सोचा है कि क्यों मॉन्टी पायथन-प्रेरित पायथन भाषा को अधिक प्राकृतिक "पायथोनस्क" के बजाय "पायथनिक" शब्द को सिक्का करने की आवश्यकता महसूस हुई ..... –

+0

इससे पहले भी पूछा गया: http: // stackoverflow। कॉम/प्रश्न/656155/क्यों-किया-पायथन-2-6-ऐड-ए-ग्लोबल-अगली-फ़ंक्शन –

उत्तर

35

PEP 3114 इस परिवर्तन का वर्णन करता है। प्रेरणा के बारे में एक अंश:

यह पीईपी, प्रस्ताव है कि next विधि __next__ को नाम दिया जा, अजगर में सभी अन्य प्रोटोकॉल जिसमें एक विधि परोक्ष एक भाषा-स्तर प्रोटोकॉल के हिस्से के रूप में कहा जाता है के साथ संगत और next नामक अंतर्निर्मित फ़ंक्शन __next__ विधि, को उस तरीके से संगत करने के लिए पेश किया जाना चाहिए जिसमें अन्य प्रोटोकॉल स्पष्ट रूप से शामिल हैं।

अधिक जानकारी के लिए इस पीईपी को पढ़ना सुनिश्चित करें।

क्यों आप उपयोग करना चाहते का सवाल है next निर्मित: एक अच्छा कारण यह है कि next विधि पायथन 3 में गायब हो जाता है तो पोर्टेबिलिटी के लिए यह बेहतर है का उपयोग शुरू करने next निर्मित जितनी जल्दी हो सके।

+0

+1: मैं यही टिप्पणी में कह रहा था। – rubik

+1

मुझे यह जवाब सबसे ज्यादा पसंद आया। विशेष रूप से नोट के कारण, कि Py3000 के पास ऑब्जेक्ट्स पर अगली विधियां नहीं होंगी। –

25

next(iterator[, default])

अपने next()अजगर में (__next__() 3) विधि को फोन करके इटरेटर से अगले आइटम प्राप्त करें। यदि डिफ़ॉल्ट दिया गया है, तो इटरेटर समाप्त होने पर इसे वापस कर दिया जाता है, अन्यथा StopIteration उठाया जाता है।

आपको default विकल्प मिलता है।

+1

+1, लेकिन तब किसी ने विधि में वैकल्पिक 'डिफ़ॉल्ट' पैरामीटर जोड़ा नहीं है: 'obj .next (डिफ़ॉल्ट) '? –

+9

@ टिम: फिर प्रत्येक पुनरावर्तक कार्यान्वयन को तर्क को डुप्लिकेट करना होगा। –

+5

इसके अलावा, पायथन 3 में 'अगली()' विधि अब मौजूद नहीं है। इसे '__next __()' द्वारा प्रतिस्थापित किया गया है। 'अगला() 'फ़ंक्शन एक एकीकृत व्यवहार की अनुमति देता है। – rubik

11

स्पष्ट अतिरिक्त कार्यक्षमता के अलावा, यह जनरेटर अभिव्यक्तियों के साथ उपयोग किए जाने पर भी बेहतर दिखता है। की तुलना करें

(x for x in lst if x > 2).next() 

next(x for x in lst if x > 2) 

के बाद एक बहुत अजगर की शैली के बाकी है, IMHO के साथ और अधिक संगत है।

+0

क्या जनरेटर अभिव्यक्ति प्रत्येक बार कथन निष्पादित होने पर शुरुआत से शुरू नहीं होती है?ऐसा लगता है कि यह केवल पहले तत्व को वापस करेगा। –

+1

@ मार्क: हां, यह इस मुहावरे का उद्देश्य है: पहले तत्व को एक पुनरावृत्त से लौटाएं जो एक निश्चित मानदंड को पूरा करता है (या अन्यथा 'स्टॉपइटरेशन' बढ़ाएं)। –

+0

उदाहरण के लिए, रूबी में यह 'संख्यात्मक # ढूंढ' जैसा है। –