दिलचस्प पोस्ट
हम कैसे जांच सकते हैं कि कोई फ़ाइल मौजूद है या Win32 प्रोग्राम का उपयोग नहीं कर रहा है? उसी कोड को ifconfig के रूप में प्राप्त करने के लिए सी कोड का उपयोग करना उद्देश्य सी में अनुलग्नक के रूप में एक फाइल भेजें फ्लोटिंग-पॉइंट गणित सी # में संगत है? यह हो सकता है? स्ट्रिंग में शब्दों का क्रम उलटा यह कैसे बताने के लिए कि एक बिंदु एक पंक्ति के दाईं ओर या बाईं तरफ है आईओएस में दृश्य पदानुक्रम का मैं कैसे निरीक्षण कर सकता हूं? जावास्क्रिप्ट में विभाजन मेवेन बिल्ड में समानांतर में रनिंग जॉनीट टेस्ट? एसक्यूएल सर्वर में group_concat के साथ एक क्वेरी कैसे करें स्थिर सूचकांक? मैं एक ही हिल छवि को कई बार कैसे आकर्षित करूं? Django DB सेटिंग्स 'अयोग्य कॉन्फ़िगर' त्रुटि पायथन में "importError: कोई मॉड्यूल नामित …" त्रुटि कैसे ठीक करें? AngularFire का उपयोग कर आईडी के आधार पर पथ के बीच डेटा जोड़ना

क्या कोई कारण है कि पायथन स्ट्रिंग की स्ट्रिंग लम्बी विधि नहीं है?

मुझे पता है कि अजगर की एक len() फ़ंक्शन है जिसका उपयोग स्ट्रिंग के आकार को निर्धारित करने के लिए किया जाता है, लेकिन मैं सोच रहा था कि स्ट्रिंग ऑब्जेक्ट की कोई विधि क्यों नहीं।

अद्यतन करें

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

वेब के समाधान से एकत्रित समाधान "क्या कोई कारण है कि पायथन स्ट्रिंग की स्ट्रिंग लम्बी विधि नहीं है?"

__len__() लंबाई विधि होती है: __len__()

पायथन में प्रोटोकॉल उन वस्तुओं पर इस पद्धति को कार्यान्वित करने के लिए है, जिनके पास लंबाई है और अंतर्निर्मित len() फ़ंक्शन का उपयोग करते हैं, जो आपके लिए इसे कहते हैं, जिस तरह से आप __iter__() को कार्यान्वित करेंगे और अंतर्निहित __iter__() का उपयोग करेंगे iter() फ़ंक्शन (या आपके पास के दृश्यों के लिए बुलाया जाने वाला तरीका) ऑब्जेक्ट्स पर हैं, जो इटरेबल हैं

अधिक जानकारी के लिए कंटेनर प्रकारों का अनुकरण देखें

पायथन में प्रोटोकॉल के विषय पर यहां एक अच्छी पढ़ी गई है: पायथन और द लीस्ट एस्टोनिशमेंट का सिद्धांत

इस सवाल का जिम का जवाब मदद मिल सकता है; मैं इसे यहाँ कॉपी करता हूँ Guido van Rossum का हवाला देते हुए:

सबसे पहले, मैंने एचसीआई के कारणों (def __len __ () के लिए x.len () पर लैन (एक्स) चुना है) बहुत बाद में आया था। वास्तव में दो intertwined कारण हैं, एचसीआई दोनों:

(ए) कुछ परिचालनों के लिए, उपसर्ग संकेतन सिर्फ पोस्टफ़िक्स – उपसर्ग (और इन्फिक्स!) के संचालन की तुलना में बेहतर पढ़ता है गणित में एक लंबी परंपरा है, जो उस अंकन पसंद करते हैं, जहां विज़िअल्स गणितज्ञ को किसी समस्या के बारे में सोचने में मदद करते हैं। आसान से तुलना करें जिसके साथ हम एक्स * (ए + बी) को एक्सए + x बी में एक सूत्र लिखते हैं, जो कच्चे ओओ नोटेशन का उपयोग करते हुए एक ही बात करने की बेरहमी से होता है।

(बी) जब मैं लिन (x) कहता हूं कि कोड पढ़ता है, तो मुझे पता है कि यह कुछ की लंबाई के लिए पूछ रहा है यह मुझे दो चीजें बताता है: परिणाम एक पूर्णांक है, और तर्क किसी प्रकार का कंटेनर है इसके विपरीत, जब मैं x.len () पढ़ता हूं, तो मुझे पहले से ही पता चलना होगा कि x एक प्रकार का कंटेनर है जिसे मानक इंटरफ़ेस लागू किया जाता है या क्लास से इनहेरिट करना एक मानक लेन () है। भ्रम की गड़बड़ी हम कभी-कभी करते हैं जब कोई ऐसा वर्ग जो मैपिंग को लागू नहीं कर रहा है तो उसे () या चाबियाँ () पद्धति है, या ऐसी कोई चीज जो फ़ाइल नहीं है, उसे लिखना () विधि है।

दूसरी बात में एक ही बात कहने पर, मैं 'लेन' को एक निर्मित ऑपरेशन के रूप में देखता हूं। मुझे लगता है कि खोने के लिए नफरत है / … /

एक len विधि है:

 >>> a = 'a string of some length' >>> a.__len__() 23 >>> a.__len__ <method-wrapper '__len__' of str object at 0x02005650> 

पायथन एक व्यावहारिक प्रोग्रामिंग भाषा है, और len() के कारण फ़ंक्शन हैं और str , list , dict आदि की कोई विधि व्यावहारिक नहीं है।

len() अंतर्निर्मित फ़ंक्शन सीधे अंतर्निर्मित प्रकारों के साथ होता है: len() का ob_size कार्यान्वयन वास्तव में PyVarObject सी PyVarObject में ob_size फ़ील्ड का मान देता है जो स्मृति में किसी भी वैरिएबल-आकार के अंतर्निहित ऑब्जेक्ट का प्रतिनिधित्व करता है यह विधि को कॉल करने से बहुत तेजी से होता है – कोई भी विशेषता लुकअप होने की आवश्यकता नहीं है संग्रह में वस्तुओं की संख्या प्राप्त करना एक सामान्य ऑपरेशन है और ऐसे बुनियादी और विविध प्रकारों के लिए कुशलतापूर्वक कार्य करना चाहिए जैसे str , list , array.array आदि।

हालांकि, स्थिरता को बढ़ावा देने के लिए, जब उपयोगकर्ता-परिभाषित प्रकार के लिए len(o) को लागू करते हैं, तो पायथन कॉल करने के लिए o.__len__() एक फ़ॉलबैक के रूप में __len__ , __abs__ और पायथन डेटा मॉडल में दर्ज़ किए गए सभी अन्य विशेष विधियों ने ऐसी वस्तुओं को बनाने में आसान बना दिया है जो बिल्ट-इन की तरह व्यवहार करते हैं, अर्थपूर्ण और अत्यधिक अनुरूप एपीआई को सक्षम करने से हम "पायथनिक" कहते हैं।

विशेष विधियों को कार्यान्वित करके, आपकी ऑब्जेक्ट चलना, ओवरलोड इन्फिक्स ऑपरेटर्स का समर्थन कर सकते हैं, ब्लॉकों के with संदर्भों का प्रबंधन कर सकते हैं। आप पायथन भाषा का उपयोग एक ढांचे के रूप में डेटा मॉडल के रूप में सोच सकते हैं जहां आप बनाये गये ऑब्जेक्ट को एक साथ एकीकृत कर सकते हैं।

दूसरा कारण, यह एक s.len() उद्धरणों द्वारा समर्थित है, यह है कि s.len() तुलना में len(s) को पढ़ने और लिखना आसान है।

संकेतन len(s)len(s) उपसर्ग नोटेशन के साथ एकरी ऑपरेटरों के अनुरूप है, जैसे abs(n) len() से अधिक बार इस्तेमाल किया जाता है, और यह लिखना आसान है।

वहाँ भी एक ऐतिहासिक कारण हो सकता है: एबीसी भाषा में जो पायथन (और इसके डिजाइन में बहुत प्रभावशाली था) से पहले था, वहां एक असामान्य ऑपरेटर था जो कि #s रूप में लिखा गया था जिसका मतलब है कि len(s)

 met% python -c 'import this' | grep 'only one' There should be one-- and preferably only one --obvious way to do it. 

तुम भी कह सकते हो

 >> x = 'test' >> len(x) 4 

पायथन 2.7.3 का उपयोग करना

यह नहीं है?

 >>> "abc".__len__() 3 

यहां कुछ महान उत्तर दिए गए हैं, और इससे पहले कि मैं अपना अपना दे दूँ, मैं कुछ रत्नों को उजागर करना चाहूंगा (कोई रद्दी वाला इरादा नहीं) मैंने यहां पढ़ा है।

  • पायथन एक शुद्ध ओओपी भाषा नहीं है – यह एक सामान्य प्रयोजन, बहु-प्रतिमान भाषा है जो प्रोग्रामर को प्रतिमान का उपयोग करने की अनुमति देता है जो वे सबसे अधिक आराम से और / या उनके समाधान के लिए सर्वोत्तम अनुकूल है।
  • फ़ंक्शंस में प्रथम श्रेणी के फ़ंक्शन होते हैं, इसलिए len वास्तव में एक वस्तु है। रूबी, दूसरी ओर, में प्रथम श्रेणी के फ़ंक्शंस नहीं हैं I इसलिए len फ़ंक्शन ऑब्जेक्ट के पास इसके स्वयं के तरीके हैं जिन्हें आप dir(len) चलाकर निरीक्षण कर सकते हैं।

यदि आपको यह अपने स्वयं के कोड में काम करने के तरीके पसंद नहीं है, तो आप अपने पसंदीदा तरीकों का उपयोग करके कंटेनरों को फिर से लागू करने के लिए तुलनीय है (नीचे दिए गए उदाहरण देखें)।

 >>> class List(list): ... def len(self): ... return len(self) ... >>> class Dict(dict): ... def len(self): ... return len(self) ... >>> class Tuple(tuple): ... def len(self): ... return len(self) ... >>> class Set(set): ... def len(self): ... return len(self) ... >>> my_list = List([1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F']) >>> my_dict = Dict({'key': 'value', 'site': 'stackoverflow'}) >>> my_set = Set({1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'}) >>> my_tuple = Tuple((1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F')) >>> my_containers = Tuple((my_list, my_dict, my_set, my_tuple)) >>> >>> for container in my_containers: ... print container.len() ... 15 2 15 15