गिरफ्तारी है। पायन में एक सरणी की लंबाई पाने के लिए पसंदीदा तरीका __ लेन __ () है?


727

में अजगर , निम्न केवल तत्वों की संख्या प्राप्त करने के लिए तरीका है?

arr.__len__()

यदि हां, तो अजीब वाक्यविन्यास क्यों?

जवाबों:


1228
my_list = [1,2,3,4,5]
len(my_list)
# 5

टुपल्स के लिए समान कार्य:

my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5

और तार, जो वास्तव में पात्रों के केवल सरणियाँ हैं:

my_string = 'hello world'
len(my_string)
# 11

यह जानबूझकर इस तरह से किया गया था ताकि सूचियां, टपल्स और अन्य कंटेनर प्रकार या पुनरावृत्तियां सभी को स्पष्ट रूप से एक सार्वजनिक .length()विधि को लागू करने की आवश्यकता नहीं थी , इसके बजाय आप बस len()'जादू' __len__()पद्धति को लागू करने वाली किसी भी चीज़ की जांच कर सकते हैं ।

यकीन है, यह बेमानी लग सकता है, लेकिन लंबाई की जाँच कार्यान्वयन में काफी भिन्नता हो सकती है, यहां तक ​​कि एक ही भाषा के भीतर भी। यह देखने के लिए असामान्य नहीं है कि एक संग्रह प्रकार एक .length()विधि का उपयोग करता है जबकि दूसरा प्रकार किसी .lengthसंपत्ति का उपयोग करता है , जबकि दूसरा उपयोग करता है .count()। भाषा-स्तर का कीवर्ड होना इन सभी प्रकारों के लिए प्रवेश बिंदु को एकीकृत करता है। यहां तक ​​कि जिन वस्तुओं को आप तत्वों की सूची नहीं मान सकते हैं, वे अभी भी लंबाई-जांच की जा सकती हैं। इसमें तार, कतार, पेड़ आदि शामिल हैं।

कार्यात्मक प्रकृति len()भी प्रोग्रामिंग की कार्यात्मक शैलियों के लिए अच्छी तरह से उधार देती है।

lengths = map(len, list_of_containers)

8
len () एक भाषा कमांड है, __len __ () कंटेनर प्रकारों पर एक विधि है।
सोवियुत

33
len () एक वैश्विक, बिलियन फ़ंक्शन है; __लेन __ () एक विधि है जिसे ऑब्जेक्ट कार्यान्वित कर सकता है। len (foo) आमतौर पर foo .__ len __ () कहकर समाप्त होता है।
टिम लेशर

13
आप उल्लेख करते हैं कि लेन की आपूर्ति करके () प्रत्येक कंटेनर को एक .length () विधि को लागू करने की आवश्यकता नहीं है, लेकिन यह कैसे अलग है, यदि प्रत्येक प्रकार अभी भी एक __len __ () विधि को लागू करता है जिसे लेन () किसी भी रूप में कहा जाता है? क्या विभिन्न कंटेनर प्रकार को लेन () द्वारा अलग तरीके से संभाला जाता है?
साइमन बी। जेनसेन

10
@ साइमन: "सभी को लागू करने की आवश्यकता नहीं है .length ()" भ्रामक है। कंटेनर प्रकार को अभी भी अपनी लंबाई वापस करने के लिए एक विधि को लागू करने की आवश्यकता है; मुद्दा यह है कि यह एक मानकीकृत प्रोटोकॉल है, न कि एक एड-हॉक विधि जिसे आपको प्रत्येक प्रकार के लिए देखना होगा। डबल-अंडरस्कोर इसका संकेत देते हैं।
कार्ल मेयर

16
मैं कार्ल मेयर से सहमत हूं - यह कहना कि "सार्वजनिक रूप से .length () विधि को स्पष्ट रूप से लागू करने की आवश्यकता नहीं है" भ्रामक है और इसके मूल-अर्थ पर, गलत है। कुछ भी अभी भी लेन को लागू करना होगा , और हमेशा अपनी खुद की लंबाई विधि को लागू कर सकते हैं जिसका नाम वे चाहते हैं - लेन फ़ंक्शन को दरकिनार करना। तो वास्तव में मैं इसे कुछ मनमानी विचित्रता के रूप में देखता हूं जो कि गुइडो दुनिया को कैसे देखता है के साथ फिट बैठता है। इसका संभवतः किसी सार्वभौमिक तर्क से कोई लेना-देना नहीं है।
बीटी

52

जिस तरह से आप किसी भी चीज़ की लंबाई लेते हैं, जो समझ में आता है (एक सूची, शब्दकोश, टपल, स्ट्रिंग, ...) उस पर कॉल lenकरना है।

l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5

"अजीब" वाक्यविन्यास का कारण यह है कि आंतरिक रूप से अजगर में अनुवाद len(object)होता है object.__len__()। यह किसी भी वस्तु पर लागू होता है। इसलिए, यदि आप कुछ वर्ग को परिभाषित कर रहे हैं और यह समझ में आता है कि इसकी लंबाई है, तो बस इस __len__()पर एक विधि निर्धारित करें और फिर lenउन उदाहरणों पर कॉल कर सकते हैं ।


23

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

इंटरफेस की पूरी सूची के लिए, यहां देखें: http://docs.python.org/reference/datamodel.html#basic-customization


23

किसी भी अजगर वस्तु की लंबाई प्राप्त करने का पसंदीदा तरीका इसे lenफ़ंक्शन के तर्क के रूप में पारित करना है । आंतरिक रूप से, अजगर तब उस विशेष __len__विधि को कॉल करने का प्रयास करेगा जो पारित किया गया था।



10

आप len(arr) सरणी की लंबाई प्राप्त करने के लिए पिछले उत्तरों में सुझाए अनुसार उपयोग कर सकते हैं । यदि आप एक 2 डी सरणी के आयाम चाहते हैं तो आप arr.shapeरिटर्न ऊंचाई और चौड़ाई का उपयोग कर सकते हैं


7

len(list_name)फ़ंक्शन एक पैरामीटर के रूप में सूची लेता है और यह सूची के __len__()फ़ंक्शन को कॉल करता है।


1

पायथन का सुझाव है कि उपयोगकर्ताओं को निरंतरता के len()बजाय उपयोग करना चाहिए __len__(), जैसे अन्य लोगों ने कहा। हालांकि, कुछ अन्य लाभ हैं:

कुछ बिल्ट-इन के लिए की तरह प्रकार list, str, bytearrayऔर इतने पर, की Cython कार्यान्वयन len()के लिए एक शॉर्टकट लेता है। यह सीधे ob_sizeसी संरचना में रिटर्न करता है, जो कॉलिंग से तेज है __len__()

यदि आप इस तरह के विवरणों में रुचि रखते हैं, तो आप लुसियानो रामलहो द्वारा "फ्लुएंट पायथन" नामक पुस्तक पढ़ सकते हैं। इसमें कई दिलचस्प विवरण हैं, और आपको अजगर को अधिक गहराई से समझने में मदद मिल सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.