मैंने सोचा था कि कारण यह था कि कंटेनर के समान इंटरफ़ेस वाले इटरेटर पर इन बुनियादी संचालन किए जा सकते थे। हालांकि, यह वास्तव में लेन के साथ काम नहीं करता है:
def foo():
for i in range(10):
yield i
print len(foo())
... TypeError के साथ विफल रहता है। लेन() एक पुनरावर्तक का उपभोग और गणना नहीं करेगा; यह केवल उन वस्तुओं के साथ काम करता है जिनमें __len__
कॉल है।
तो, जहां तक मेरा संबंध है, लेन() मौजूद नहीं होना चाहिए। लेन (ओबीजे) की तुलना में obj.len कहने के लिए यह और अधिक स्वाभाविक है, और शेष भाषा और मानक पुस्तकालय के साथ बहुत अधिक संगत है। हम परिशिष्ट नहीं कहते (एलएसटी, 1); हम lst.append (1) कहते हैं। लंबाई के लिए एक अलग वैश्विक विधि होने के नाते एक अजीब, असंगत विशेष मामला है, और वैश्विक नामस्थान में एक बहुत ही स्पष्ट नाम खाता है, जो पाइथन की एक बहुत बुरी आदत है।
यह बतख टाइपिंग से असंबंधित है; आप यह निर्धारित करने के लिए getattr(obj, "len")
कह सकते हैं कि आप किसी ऑब्जेक्ट पर आसानी से लेन का उपयोग कर सकते हैं - और अधिक लगातार - getattr(obj, "__len__")
का उपयोग कर सकते हैं।
जो कुछ भी कहा जाता है, भाषा वार के रूप में जाना जाता है - जो लोग इसे एक वार्ट पर विचार करते हैं - यह एक बहुत ही आसान व्यक्ति है जिसके साथ रहना है।
दूसरी तरफ, न्यूनतम और अधिकतम पुनरावृत्तियों पर काम करते हैं, जो उन्हें किसी विशेष वस्तु के अलावा उपयोग देता है। यह स्पष्ट है, तो मैं बस एक उदाहरण देता हूँ:
import random
def foo():
for i in range(10):
yield random.randint(0, 100)
print max(foo())
हालांकि, वहाँ अपने व्यवहार को ओवरराइड करने के लिए कोई __min__
या __max__
तरीके हैं, इसलिए वहाँ क्रमबद्ध कंटेनरों के लिए कुशल खोज प्रदान करने के लिए कोई सुसंगत तरीका है। यदि एक कंटेनर को उसी कुंजी पर सॉर्ट किया गया है जिसे आप खोज रहे हैं, तो न्यूनतम (अधिकतम) ओ (एन) के बजाय ओ (1) ऑपरेशंस हैं, और इसका खुलासा करने का एकमात्र तरीका एक अलग, असंगत विधि है। (यह निश्चित रूप से भाषा में अपेक्षाकृत आसानी से तय किया जा सकता है।)
इसके साथ किसी अन्य समस्या का पालन करने के लिए: यह पाइथन की विधि बाध्यकारी के उपयोग को रोकता है। एक सरल, काल्पनिक उदाहरण के रूप में, आप एक सूची के लिए मान जोड़ने के लिए एक समारोह की आपूर्ति करने के लिए इस कर सकते हैं:
def add(f):
f(1)
f(2)
f(3)
lst = []
add(lst.append)
print lst
और यह सब सदस्य कार्यों पर काम करता है। आप न्यूनतम, अधिकतम या लेन के साथ ऐसा नहीं कर सकते हैं, हालांकि, वे उस ऑब्जेक्ट के तरीके नहीं हैं जिन पर वे काम करते हैं। इसके बजाए, आपको functools.partial का सहारा लेना होगा, जो कि अन्य भाषाओं में आम तौर पर एक बेकार द्वितीय श्रेणी का वर्कअराउंड है।
बेशक, यह एक असामान्य मामला है; लेकिन यह असामान्य मामलों है जो हमें एक भाषा की स्थिरता के बारे में बताते हैं।
मुझे व्यक्तिगत रूप से 'न्यूनतम (1,2) 'और' मिनट ([1,2])' बेहद संगत होने के लिए मिलता है। सब कुछ जावा नहीं होना चाहिए –
@ टॉमलेज़: 'x.foo()' जैसी विधि कॉल के साथ 'len (x)' संगत कैसे है? वे ऑब्जेक्ट एक्स पर दोनों ऑपरेशन हैं, है ना? यह जावा जैसी होने के बारे में नहीं है। यह [कम आश्चर्य के सिद्धांत] (http://en.wikipedia.org/wiki/Principle_of_least_surprise) के अनुरूप है। रूबी उस सिद्धांत का पालन करता है। –