2015-10-10 9 views
15

मिनट एक अजगर के बारे में भ्रामक बस अब मैं this page पर एक प्रश्नोत्तरी देखा:प्रश्नोत्तरी

>>> x, y = ??? 
>>> min(x, y) == min(y, x) 
False 

उदाहरण जवाब

x, y = {0}, {1} 
प्रलेखन मैं जानता हूँ कि से

है कि:

min(iterable[, key=func]) -> value
min(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its smallest item.
With two or more arguments, return the smallest argument.

लेकिन min({0},{1})={0} और min({1},{0})={1} क्यों है?

min({0,2},1) # 1 
min(1,{0,2}) # 1 
min({1},[2,3]) # [2,3] 
min([2,3],1) # 1 
+1

प्रिंट बाहर चर, {} एक सेट [] एक सूची .. आदि है – C1sc0

+0

कि उदाहरण के जवाब गलत है। (http://i.imgur.com/C9nYDTF.png) – Elipzer

+0

@ सी 1 एससी 0 मुझे पता है। लेकिन परिणाम क्यों? '1' और' {0,2} 'के लिए –

उत्तर

7

min इस तरह मोटे तौर पर लागू किया गया है:

def min(*args): 
    least = args[0] 
    for arg in args: 
     if arg < least: 
      least = arg 
    return least 

तरह से सेट के लिए तुलना ऑपरेटरों काम मान्यताओं में से एक को तोड़ने कि इस परोक्ष बनाता है: कि वस्तुओं की प्रत्येक जोड़ी के लिए, या तो वे बराबर हैं, या a < b या b < a। न तो {0} और न ही {1} एक से कम की तुलना करें, इसलिए min आपको असंगत उत्तर देता है।

आपके द्वारा देखे जाने वाले अन्य परिणाम नियमों के कारण हैं कि कैसे पाइथन मिश्रित प्रकारों के लिए आदेश को परिभाषित करता है। set और int तुलनीय नहीं हैं - इनमें से कोई भी अन्य की तुलना करने के लिए नियम परिभाषित नहीं करता है। यह पाइथन 2 को "मनमानी लेकिन लगातार क्रम" नामक नियम लागू करने के लिए प्रेरित करता है - प्रकारों में से एक को "निचला" प्रकार चुना जाता है, और यह कार्यक्रम के जीवनकाल के लिए निम्न प्रकार का रहेगा। व्यावहारिक रूप से, यह आपके द्वारा चलाए जाने वाले सभी कोडों में समान होगा, क्योंकि इसे टाइप नामों की तुलनात्मक रूप से तुलना करके कार्यान्वित किया जाता है - लेकिन सिद्धांत रूप में, यह बदल सकता है।

"मनमानी लेकिन लगातार आदेश" नियम पायथन 3 से हटा दिया गया है, क्योंकि वास्तव में इसका प्रभाव केवल बग मास्क करना था। जब वहाँ एक आदेश को खोजने के लिए कोई निर्धारित नियम है, अजगर अब आप ऐसा कहता है:

>>> 1 < {0} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: int() < set() 
+0

में मैं बिल्कुल कोडिंग पर चूसता हूं इसलिए मेरी माफ़ी गलत है, लेकिन मुझे लगता है कि यह आपके लूप में "अगर तर्क <कम से कम" होना चाहिए, न कि दूसरी तरफ। यदि नहीं, तो आप मूल रूप से इसके बजाय अधिकतम फ़ंक्शन चला रहे हैं (मुझे लगता है ...)। –

+0

वैसे, और मुझे यकीन है कि यह एक लंबा जवाब हो सकता है, इसलिए यदि आपके पास समय नहीं है तो मैं वास्तव में किसी अन्य पोस्ट या आलेख के संदर्भ की सराहना करता हूं, लेकिन आप संदर्भ द्वारा अपना तर्क क्यों पारित कर रहे हैं, क्या हैं फायदे नुकसान? –

+0

@ जेरेमी हाँ, यह वास्तव में एक त्रुटि थी। संदर्भ द्वारा गुजरने के लिए, यह '* 'का अर्थ नहीं है - पायथन सी जैसे पॉइंटर्स नहीं करता है (* सभी * तर्क पासिंग सी ++ संदर्भ की तरह अधिक है, सिवाय इसके कि नाम को पुन: असाइन करना मूल वस्तु को प्रभावित नहीं करता है - दस्तावेज़ इसे कॉल करते हैं [असाइनमेंट द्वारा पास करें] (https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by -रेंफर)। * * 'पायथन का वैरगास करने का तरीका है - इसका मतलब है कि आप इसे जितना चाहें उतने तर्क के रूप में इसे 'न्यूनतम (1,2,3)' आदि के रूप में कॉल कर सकते हैं, और यह उन्हें सभी में एकत्र करेगा 'args' नामक सूची। – lvc

9

तुलना ऑपरेटरों <, <=, >=, और > जांच करें कि क्या एक सेट, एक सख्त सबसेट, सबसेट, सुपरसेट, या किसी अन्य के सख्त superset है क्रमशः:

मैं भी कुछ अन्य लोगों की कोशिश की।

{0} और {1} इन सभी के लिए False हैं, इसलिए परिणाम चेक ऑर्डर और ऑपरेटर पर निर्भर करता है।

+0

' यह हमेशा क्यों होता है 1? –

8

कुंजी यहाँ बिंदु, है दो सेट एक दूसरे के सबसेट नहीं हैं, इसलिए दोनों < के लिए False हैं भले ही वे समान नहीं हैं:

>>> {0} < {1} 
False 
>>> {0} > {1} 
False 
>>> {0} == {1} 
False 

तो जो एक छोटी है? तथ्य यह है कि सेट strict weak ordering प्रदान नहीं करते हैं इसका मतलब है कि कोई सही जवाब नहीं है।

+0

क्या आप बता सकते हैं कि क्यों पाइथन में '1' <' {0,2} '? पाइथन 2 में –

+4

।एक्स, विभिन्न प्रकार की वस्तुओं की तुलना उनके प्रकार के तारों से की जाती है, जो मुझे ज्यादा समझ में नहीं आता है। पायथन 3.x में, '1 <{0,2}' अवैध है। –

+1

@YuHao हां, ध्यान दें कि '1 <{0,2}' टाइपररर बढ़ाएगा: अनियमित प्रकार: int()

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