python - ज़िप फ़ंक्शन को समझना




iterator zip (2)

सभी चर्चा अजगर 3.1.2; मेरे प्रश्न के स्रोत के लिए अजगर डॉक्स देखें

मुझे पता है कि zip क्या करता है; मुझे समझ में नहीं आता कि ऐसा क्यों किया जा सकता है:

def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    iterables = map(iter, iterables)
    while iterables:
        yield tuple(map(next, iterables))

मान लें कि मैं zip(c1, c2, c3) कॉल करता हूं। अगर मैं सही ढंग से समझता हूं, तो आरंभी शुरू में ट्यूपल (सी 1, सी 2, सी 3) है।

रेखा iterables = map(iter, iterables) इसे एक इटरेटर में बदल देती है जो आईटर (सी 1), आईटर (सी 2), आईटर (सी 3) के जरिए आईटरेट की जाएगी।

लूप के अंदर, map(next, iterables) एक इटरेटर है जो next(iter(c1)) , next(iter(c2)) , और next(iter(c3)) जाता है। tuple कॉल इसे (next(iter(c1)), next(iter(c2)), next(iter(c3)) परिवर्तित कर देता है (next(iter(c1)), next(iter(c2)), next(iter(c3)) जहां तक ​​कि मैं बता सकता हूं कि पहले तर्क पर इसकी तर्क ( iterables ) थका हुआ है। यह समझ में नहीं आ रहा है कि कब लूप को जारी रखने के लिए कैसे प्रबंधित किया जाता है कि यह iterables जांच iterables ; और यदि यह जारी रखता है तो tuple कॉल खाली ट्यूपल (इटरेटर थका हुआ) क्यों नहीं लौटाता।

मुझे यकीन है कि मुझे बहुत ही सरल कुछ याद आ रहा है ..


ऐसा प्रतीत होता है कि यह दस्तावेज़ीकरण में एक बग है। 'समकक्ष' कोड पायथन 2 में काम करता है, लेकिन पायथन 3 में नहीं, जहां यह अनंत लूप में जाता है।

और दस्तावेज़ीकरण के नवीनतम संस्करण में एक ही समस्या है: http://docs.python.org/release/3.1.2/library/functions.html

ऐसा लगता है कि परिवर्तन 61361 समस्या थी, क्योंकि यह अजगर 2.6 से परिवर्तनों को विलीन कर दिया, बिना यह सत्यापित किए कि वे अजगर 3 के लिए सही थे।

ऐसा लगता है कि इस समस्या को ट्रंक प्रलेखन सेट पर मौजूद नहीं है, लेकिन संभवतः आपको इसके बारे में http://bugs.python.org/ पर एक बग की रिपोर्ट करनी चाहिए।


ऐसा लगता है कि यह कोड Python-2.x कोड के रूप में पढ़ा जाना माना जाता है। यह ठीक तरह से py3k में नहीं चलता है

अजगर -2 में क्या होता है, यह map , iterators की एक सूची वापस करता है, जब next को कहा जाता है कि यह इटरेटर का एक तत्व देता है, उन तत्वों को ट्यूपल में जोड़ दिया जाता है तो, दिए गए

>>> zip('ABCD', 'xy')

इरेबरेबल्स 2 इटरेटर्स की सूची है, जबकि लूप के भीतर प्रत्येक पुनरावृत्ति पर, इटरेटर के अगले (पहले शेष) तत्व का सेवन किया जाता है (' 'A' और 'x' , आदि), और एक ट्यूपल के एक तत्व के रूप में पैदा होता है, उसके बाद अंतिम तत्व उत्पन्न हो जाते हैं, (3 StopIteration चलने पर) उठाया जाता है StopIteration जनरेटर को रोकता है। while iterables हमेशा True





python-3.x