2010-10-05 22 views
14

सभी चर्चा पाइथन 3.1.2 के बारे में है; मेरे प्रश्न के स्रोत के लिए Python docs देखें।ज़िप कार्य को समझना

मुझे पता है कि 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)) में परिवर्तित करता है, जहां तक ​​मैं कह सकता हूं, पहले कॉल पर इसके तर्क (iterables) को समाप्त कर देता है। मुझे समझ में नहीं आता कि while लूप कैसे जारी रखने के लिए प्रबंधित करता है कि यह iterables की जांच करता है; और यदि यह जारी रहता है तो tuple कॉल खाली टुपल वापस नहीं लौटाता है (इटरेटर थक गया है)।

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

+0

अजीब, यह मेरे लिए अंतहीन रूप से लूप करता है भले ही यह पूरी तरह से ठीक दिखता है ... और मेरा स्वयं का प्रयास या तो काम नहीं करता है। मैं चौंक गया हूं। – delnan

+0

मुझे लगता है कि यह सिर्फ छद्म कोड है और इसे सचमुच नहीं लिया जाना चाहिए। –

+1

@Radomir Dopieralski यह पायथन कोड है, छद्म कोड नहीं, सीधे दस्तावेज़ीकरण से कॉपी किया गया। अगर मैं इस पर भरोसा नहीं कर सका तो मैं काफी दुखी होगा, और इसके बजाय मुझे वास्तव में क्या करना है इसके बारे में मेरा सर्वश्रेष्ठ अनुमान बनाना था। जब भी मैं फ़ंक्शन के अर्थशास्त्र के बारे में 100% निश्चित नहीं हूं, तो मैं इस तरह के कोड को संदर्भित करता हूं। – max

उत्तर

9

ऐसा लगता है कि यह दस्तावेज में एक बग है। 'समतुल्य' कोड python2 में काम करता है लेकिन पायथन 3 में नहीं, जहां यह एक अनंत लूप में जाता है। http://docs.python.org/release/3.1.2/library/functions.html

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

और प्रलेखन के नवीनतम संस्करण को एक ही समस्या है।

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

+0

ठीक है, रिपोर्ट की गई।स्पष्टीकरण के लिए: समय सत्य का मूल्यांकन करेगा क्योंकि 'iterables' एक पुनरावर्तक है; और इटेटरेटर हमेशा इसकी सामग्री के बावजूद सत्य का मूल्यांकन करता है। इसके अलावा, लूप के माध्यम से पहले रन पर 'iterables' समाप्त हो जाएगा, इसलिए उसके बाद खाली ट्यूपल उत्पन्न करना जारी रहेगा। सही बात? – max

+0

@max: यह 'True'' का मूल्यांकन करेगा क्योंकि 'iterables' एक गैर-खाली सूची है। क्या आपने जो भी पोस्ट किया है उसे भी पढ़ा? – SilentGhost

+0

क्षमा करें आपके उत्तर को याद किया :(तो यदि पाइथन 2 में चलता है, तो यह सच होगा क्योंकि पुनरावृत्त सूची खाली नहीं है, लेकिन यदि पाइथन 3 में चलाया जाता है (जिसे मैंने अपनी टिप्पणी में माना है), तो यह सच होगा क्योंकि पुनरावृत्त एक पुनरावर्तक है , और इटेटरेटर हमेशा सही, सही? – max

7

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

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

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

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

+0

पाइथन-2.x स्पष्टीकरण के लिए +1 .. – max

+0

@max इसे टैग किया गया है python-3। पहला वाक्य कहता है कि यह सिर्फ अजगर के बारे में है 3. आधार के आधार पर उत्तर क्यों है कि उत्तर पाइथन -2 के लिए है? डिट्टो रूबी, या कुछ और जो अजगर -3 नहीं है? –

+1

@ रॉबर्टग्रांट क्योंकि पाइथन 2 का जिक्र करना एकमात्र तरीका था आधिकारिक पायथन दस्तावेज स्पष्ट रूप से पूरी तरह से गलत था। – max

संबंधित मुद्दे