पायथन सूची पुनरावृत्ति व्यवहार और अगला (पुनरावृत्ति)


147

विचार करें:

>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2

इसलिए, पुनरावृत्ति को आगे बढ़ाना, जैसा कि अपेक्षित है, उसी वस्तु को बदलकर नियंत्रित किया जाता है।

यह मामला होने के नाते, मैं उम्मीद करूंगा:

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

हर दूसरे तत्व को छोड़ने के लिए: कॉल को nextएक बार पुनरावृत्ति को आगे बढ़ाना चाहिए, फिर लूप द्वारा किए गए निहित कॉल को इसे दूसरी बार आगे बढ़ाना चाहिए - और इस दूसरी कॉल का परिणाम सौंपा जाएगा i

यह नहीं है लूप सूची में सभी वस्तुओं को प्रिंट करता है, बिना किसी लंघन के।

मेरा पहला विचार यह था कि ऐसा हो सकता है क्योंकि लूप कॉल iterपर है जो इसे पारित किया गया है, और यह एक स्वतंत्र पुनरावृत्ति दे सकता है - यह मामला नहीं है, जैसा कि हमारे पास है iter(a) is a

तो, क्यों nextइस मामले में पुनरावृत्ति अग्रिम करने के लिए प्रकट नहीं होता है?

जवाबों:


197

क्या आप देख है दुभाषिया के रिटर्न मान वापस गूंज next()के अलावा iप्रत्येक यात्रा मुद्रित किया जा रहा:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    next(a)
... 
0
1
2
3
4
5
6
7
8
9

तो 0इसका आउटपुट है print(i), इंटरएक्टिव इंटरप्रेटर आदि 1से next()प्रतिध्वनित होने वाला रिटर्न वैल्यू , इसमें सिर्फ 5 पुनरावृत्तियां हैं, प्रत्येक पुनरावृत्ति जिसके परिणामस्वरूप 2 लाइनें टर्मिनल को लिखी जा रही हैं।

यदि आप next()अपेक्षा के अनुसार काम करते हैं

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    _ = next(a)
... 
0
2
4
6
8

या इंटरएक्टिव इंटरप्रेटर इको से आउटपुट को अलग करने के लिए अतिरिक्त जानकारी प्रिंट करें print():

>>> a = iter(list(range(10)))
>>> for i in a:
...    print('Printing: {}'.format(i))
...    next(a)
... 
Printing: 0
1
Printing: 2
3
Printing: 4
5
Printing: 6
7
Printing: 8
9

दूसरे शब्दों में, next()अपेक्षित के रूप में काम कर रहा है, लेकिन क्योंकि यह इट्रेटर से अगला मान लौटाता है, इंटरएक्टिव इंटरप्रेटर द्वारा गूँजती है, आपको यह विश्वास दिलाया जाता है कि लूप की अपनी इट्रेटर कॉपी किसी न किसी तरह से है।


13
मुझे दुभाषिया के इस व्यवहार की जानकारी नहीं थी। मुझे खुशी है कि मुझे पता चला कि कुछ वास्तविक समस्या को हल करने के दौरान बहुत समय खोने के बारे में सोचकर।
ब्रांडज़ी

5
... *मर जाता है*। इसका सबसे बुरा यह है कि, मैं इस दुभाषिया व्यवहार का उल्लेख करना याद रख सकता हूं कि शायद एक हफ्ते पहले।
पीवीसी

दिलचस्प। मैंने इसमें a: next (a) के लिए कोशिश की; प्रिंट i और सोचा कि मैं 1 पर जाऊंगा और 1,3,5,7,9 प्रिंट करूंगा। लेकिन फिर भी यह 0,2,4,6,8 है। क्यों?
user2290820

3
iपहले से ही था सौंपा । next(a)अर्थ यह है कि अगले चरण 2का कार्य सौंपा गया iहै, तो आप के लिए कदम aके साथ फिर से, प्रिंट i, आदि
मार्टिन पीटर्स

1
यह काम नहीं करता है अगर n विषम है - StopIteration excepetio निस उठाया जब next(a)के बाद सूची exausted है कहा जाता है।
राफ

13

जो हो रहा है, next(a)वह अगले मूल्य का रिटर्न देता है, जो कंसोल पर मुद्रित होता है क्योंकि यह प्रभावित नहीं होता है।

आप इस मूल्य के साथ एक चर को प्रभावित कर सकते हैं:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    b=next(a)
...
0
2
4
6
8

8

मुझे मौजूदा उत्तर थोड़े भ्रमित करने वाले लगते हैं, क्योंकि वे केवल अप्रत्यक्ष रूप से कोड उदाहरण में आवश्यक रहस्यमय चीज़ को इंगित करते हैं: दोनों "प्रिंट आई" और "अगला (ए)" उनके परिणामों को प्रिंट करने का कारण बन रहे हैं।

चूंकि वे मूल अनुक्रम के वैकल्पिक तत्वों को प्रिंट कर रहे हैं, और यह अप्रत्याशित है कि "अगला (ए)" बयान छपाई कर रहा है, ऐसा प्रतीत होता है जैसे "प्रिंट आई" कथन सभी मानों को प्रिंट कर रहा है।

उस प्रकाश में, यह अधिक स्पष्ट हो जाता है कि एक चर के "अगले (ए)" के परिणाम को निर्दिष्ट करना इसके '' परिणाम के मुद्रण को रोकता है, ताकि बस वैकल्पिक मान "i" लूप चर मुद्रित हो। इसी तरह, "प्रिंट" स्टेटमेंट बनाने से कुछ और विशिष्ट हो जाता है, साथ ही साथ यह स्पष्ट नहीं हो जाता है।

(मौजूदा उत्तरों में से एक अन्य का खंडन करता है क्योंकि उस उत्तर में एक ब्लॉक के रूप में मूल्यांकन किया गया उदाहरण कोड है, ताकि दुभाषिया "अगले (ए)" के लिए मध्यवर्ती मूल्यों की रिपोर्ट नहीं कर रहा है।

प्रश्नों का उत्तर देने में भ्रामक बात, सामान्य रूप से, स्पष्ट है कि उत्तर जानने के बाद क्या स्पष्ट है। यह मायावी हो सकता है। इसी तरह आलोचनात्मक जवाब एक बार उन्हें समझने के बाद। यह दिलचस्प है...


2

आपके पाइथन / कंप्यूटर में कुछ गड़बड़ है।

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

>>> 
0
2
4
6
8

उम्मीद की तरह काम करता है।

पायथन 2.7 में परीक्षण किया गया और पायथन 3+ में। दोनों में ठीक से काम करता है


5
मुझे @lvc के रूप में एक ही परिणाम मिलता है (केवल IDLE पर, जब स्क्रिप्ट के रूप में निष्पादित होता है तो मुझे यह मिलता है))
jamylak

3
@बार गुलाब केवल अगर आप स्क्रिप्ट के रूप में चलाते हैं।
क्विंटेक

1
यह इंटरैक्टिव शेल के माध्यम से कोड डालने का व्यवहार है। यदि फ़ंक्शन का उपयोग किए बिना मान लौटता है, तो दुभाषिया इसे डिबग आउटपुट के रूप में खोल
देगा

2

उन लोगों के लिए जो अभी भी नहीं समझते हैं।

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    next(a)
... 
0 # print(i) printed this
1 # next(a) printed this
2 # print(i) printed this
3 # next(a) printed this
4 # print(i) printed this
5 # next(a) printed this
6 # print(i) printed this
7 # next(a) printed this
8 # print(i) printed this
9 # next(a) printed this

जैसा कि दूसरों ने पहले ही कहा है, nextउम्मीद के मुताबिक पुनरावृत्ति 1 को बढ़ाता है। किसी वैरिएबल पर इसका लौटा मान निर्दिष्ट करने से जादुई रूप से इसका व्यवहार नहीं बदलता है।


1

यदि आप एक समारोह के रूप में बुलाया चाहते हैं तो यह व्यवहार करता है:

>>> def test():
...     a = iter(list(range(10)))
...     for i in a:
...         print(i)
...         next(a)
... 
>>> test()
0
2
4
6
8
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.