2010-05-27 9 views
21

इन बिल्ट-इन अजगर डेटा प्रकार के बीच क्या अंतर है? जैसा कि मैंने इसे देखा, सभी तीन अनिवार्य रूप से प्रतिनिधित्व करते हैं कि सी ++ और जावा कॉल सर क्या है। , तार:पायथन में सूची, अनुक्रम और टुकड़ा के बीच अंतर? <em>सूची</em>, <em>अनुक्रम</em> और <em>टुकड़ा</em>:

+8

पायथन [दस्तावेज़ों में परिभाषाएं हैं] (http://docs.python.org/glossary.html)। – SilentGhost

उत्तर

10
  • list सादे सरणी से अधिक हैं। आप वस्तुओं की संख्या के बिना उन्हें प्रारंभ कर सकते हैं। आप append/push कर सकते हैं, आप remove/pop/del आइटम से आइटम प्राप्त कर सकते हैं, आप विभिन्न प्रकार की वस्तुओं (उदाहरण के लिए, [1,'e', [3]]) की सूचियां प्राप्त कर सकते हैं, आप रिकर्सिव सूचियां प्राप्त कर सकते हैं ... और आप सूचियों को टुकड़ा कर सकते हैं, जिसका अर्थ है केवल कुछ वस्तुओं के साथ एक नई सूची प्राप्त करना।
  • slicea[start:stop:step] रूप में विस्तारित स्लाइसिंग को संभालने के लिए "दृश्यों के पीछे" ऑब्जेक्ट प्रकार का उपयोग किया जाता है, help(slice) बताता है।

"अनुक्रम" एक वस्तु नहीं है, एक अनौपचारिक इंटरफेस की तरह कुछ वस्तुओं जैसे list लागू करें।

+4

पायथन डेवलपर्स अन्यथा सोचते हैं: ['सूची': एक अंतर्निहित पायथन अनुक्रम। इसके नाम के बावजूद यह एक लिंक्ड सूची की तुलना में अन्य भाषाओं में एक सरणी के समान है क्योंकि तत्वों तक पहुंच 'ओ (1) '।] है (http://docs.python.org/py3k/glossary.html#term- सूची) – SilentGhost

+1

शायद बेहतर सी ++ समानता std :: वेक्टर है, हेटरोजेनस को छोड़कर। –

3
  • सूचियों, एक दृश्य प्रकार के होते हैं एक सरणी

  • अनुक्रम प्रकार एक कार्यात्मक सुपरसेट वर्णन करने के लिए इसी तरह की:

छह अनुक्रम प्रकार के होते हैं यूनिकोड तार, सूचियां, tuples, बफर, और xrange वस्तुओं।

  • स्लाइस (या सबस्ट्रिंग भी) subarrays के लिए एक अंकन कर रहे हैं

और पढ़ें ... http://docs.python.org/glossary.html

2

सच पूछिये तो, एक टुकड़ा एक प्रकार है जो सूचकांक की एक श्रृंखला का प्रतिनिधित्व करता है, उदाहरण के लिए एक शुरुआत, रुको, और एक कदम। एक टुकड़ा बिल्कुल एक कंटेनर प्रकार नहीं है। आप एक सूची को इंडेक्स करने के लिए एक टुकड़ा का उपयोग कर सकते हैं, जिसके परिणामस्वरूप एक नई सूची जो मूल सूची के एक उपन्यास की एक प्रति है।

सूचियां सी ++ सरणी से भिन्न होती हैं जिसमें वे विषम होते हैं; तत्वों को एक ही प्रकार के होने की आवश्यकता नहीं है। और जैसा कि MYYN ने पहले ही बताया है, "अनुक्रम" एक पाइथन प्रकार नहीं है बल्कि विभिन्न प्रकार के अंतर्निहित प्रकारों का विवरण है।

5

एक सूची एक अनुक्रम है लेकिन एक अनुक्रम आवश्यक रूप से एक सूची नहीं है। अनुक्रम किसी भी प्रकार का है जो अनुक्रम इंटरफ़ेस ("प्रोटोकॉल") का समर्थन करता है। यह सख्त विरासत पदानुक्रम के बजाय बतख-टाइपिंग द्वारा किया जाता है। ध्यान दें कि अनुक्रम कंटेनर हैं, लेकिन कंटेनर जरूरी अनुक्रम नहीं हैं। (अनुक्रम, अच्छी तरह से अनुक्रमिक हैं!)

देखें http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange

स्लाइस वस्तुओं आम तौर पर परोक्ष वाक्यात्मक चीनी (foo[2:5]) और के माध्यम से बनाई गई हैं इस तरह के __getitem__ के रूप में कंटेनर प्रकार विशेष तरीकों() जो आप ओवरराइड कर सकते हैं करने के लिए प्रदान की है। आम तौर पर आपको स्लाइस से निपटने की ज़रूरत नहीं है जबतक कि आप अपने स्वयं के अनुक्रम/कंटेनर नहीं बनाते।

देखें http://docs.python.org/reference/datamodel.html#specialnames

सूचियाँ सरणियों के बराबर हैं। मैं निश्चित नहीं हूं, लेकिन मुझे लगता है कि इसे गतिशील रूप से विस्तारित सरणी के रूप में सीपीथन में कार्यान्वित किया गया है। हालांकि, इंटरफ़ेस इसे बनाता है ताकि यह केवल एक सादे पुरानी सरणी की तुलना में सी ++ एसटीएल वेक्टर की तरह हो।

33

आप अपने सवाल में बहुत अलग बातें मिश्रण कर रहे हैं, तो मैं बस एक अलग प्रश्न ;-P

जवाब देंगे अब आप के बारे में अजगर में सबसे महत्वपूर्ण इंटरफेस में से एक पूछ रहे हैं: iterable - यह मूल रूप से कुछ भी है आप for elem in iterable जैसे उपयोग कर सकते हैं।

iterable में तीन वंशज हैं: sequence, generator और mapping

  • एक अनुक्रम रैंडम एक्सेस के साथ एक iterable है। आप इससे पहले आइटमों का उपभोग किए बिना अनुक्रम के किसी भी आइटम के लिए पूछ सकते हैं। इस संपत्ति के साथ आप slices बना सकते हैं, जो आपको एक से अधिक तत्व प्रदान करता है। एक टुकड़ा आपको बाद में दे सकता है: seq[from:until] और प्रत्येक nth आइटम: seq[from:until:nth]list, tuple और str सभी अनुक्रम हैं।

  • यदि प्रवेश पूर्णांक स्थितियों की बजाय कुंजी के माध्यम से किया जाता है, तो आपके पास मैपिंग है। dict मूल मैपिंग है।

  • सबसे बुनियादी पुनरावृत्त जनरेटर है। यह कोई यादृच्छिक अभिगम का समर्थन नहीं करता है और इसलिए कोई टुकड़ा नहीं करता है। आपको दिए गए क्रम में सभी वस्तुओं का उपभोग करना होगा। जनरेटर आम तौर पर केवल तभी आइटम बनाते हैं जब आप उन्हें फिर से करते हैं। generators बनाने का सामान्य तरीका जनरेटर अभिव्यक्तियां हैं। वे गोल ब्रैकेट को छोड़कर सूची समझ की तरह दिखते हैं, उदाहरण के लिए (f(x) for x in y)yield कीवर्ड का उपयोग करने वाले फ़ंक्शन को कॉल करने से जनरेटर भी लौटाता है।

आम एडाप्टर सभी iterables को इटरेटर है। iterators में एक ही इंटरफेस है जो वे सबसे बुनियादी प्रकार का समर्थन करते हैं, generator। वे iter को एक पुनरावर्तनीय पर कॉल करके स्पष्ट रूप से बनाए जाते हैं और सभी प्रकार के लूपिंग संरचनाओं में अंतर्निहित रूप से उपयोग किए जाते हैं।

+0

मुझे इस उत्तर में जनरेटर का उल्लेख पसंद है। "आलसी" और "अनंत" के बारे में सोचें। – Donald

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