2010-10-27 14 views
5

मैं निम्नलिखित कोड मैं समझने की कोशिश कर रहा हूँ:समझौता __call__ और list.sort (key)

>>> class DistanceFrom(object): 
     def __init__(self, origin): 
      self.origin = origin 
     def __call__(self, x): 
      return abs(x - self.origin) 

>>> nums = [1, 37, 42, 101, 13, 9, -20] 
>>> nums.sort(key=DistanceFrom(10)) 
>>> nums 
[9, 13, 1, 37, -20, 42, 101] 

किसी को भी यह कैसे काम करता व्याख्या कर सकते हैं? जहां तक ​​मुझे समझा गया है, __call__ क्या कहा जाता है जब object() कहा जाता है - ऑब्जेक्ट को फ़ंक्शन के रूप में कॉल करना।

मुझे नहीं पता कि nums.sort(key=DistanceFrom(10)) कैसे है। यह कैसे काम करता है? क्या कोई इस लाइन को समझा सकता है?

धन्यवाद!

उत्तर

7

यहाँ मैं एक समारोह DistanceFrom() जो अपनी कक्षा में एक समान तरीके से इस्तेमाल किया जा सकता को परिभाषित किया है (सीधे तत्वों की तुलना में), लेकिन पालन करने के लिए आसान हो सकता है है

>>> def DistanceFrom(origin): 
...  def f(x): 
...   retval = abs(x - origin) 
...   print "f(%s) = %s"%(x, retval) 
...   return retval 
...  return f 
... 
>>> nums = [1, 37, 42, 101, 13, 9, -20] 
>>> nums.sort(key=DistanceFrom(10)) 
f(1) = 9 
f(37) = 27 
f(42) = 32 
f(101) = 91 
f(13) = 3 
f(9) = 1 
f(-20) = 30 
>>> nums 
[9, 13, 1, 37, -20, 42, 101] 

तो आप देखते हैं कि वस्तु DistanceFrom द्वारा दिया एक बार बुलाया nums के प्रत्येक आइटम के लिए और उसके बाद nums लौटे मूल्यों के अनुसार छाँटे गए लौटा दिया जाता है है

+0

धन्यवाद! यह पूर्ण है। – user225312

+0

@ अल्फ्रेड, आपका स्वागत है –

4

key फ़ंक्शन ऑब्जेक्ट DistanceFrom(10) का उपयोग करके यह nums सूची में सूची देता है। इसे कॉल करने योग्य होना चाहिए क्योंकि key को कॉल करने योग्य होना चाहिए। परिणामी आउटपुट को 10 से उनकी "रिमोटनेस" द्वारा क्रमबद्ध किया जाता है, यह 9 है, 10 का सबसे नज़दीकी मूल्य 101 है, 101 सबसे दूर है।

के बाद वस्तु initialised जाता है और sort पद्धति के लिए एक key पैरामीटर के रूप में पारित कर दिया, प्रत्येक यात्रा यह वर्तमान मूल्य के साथ बुलाया जाएगा पर (है कि क्या x है) और दिए गए मान में x की स्थिति का निर्धारण करने के लिए इस्तेमाल किया जाएगा परिणामस्वरूप सूची।

+0

यह कैसे निष्पादित किया जाता है? मेरा मतलब है, DistanceFrom (10) self.origin = 10. सेट करता है उसके बाद? – user225312

+0

@Alfred: मेरा संपादन देखें – SilentGhost

+0

"__ init __" एक कन्स्ट्रक्टर है जिसे ऑब्जेक्ट कुंजी – OlimilOops

8

__call__ पायथन में कक्षा को चलाने की अनुमति देता है जैसे कि यह एक कार्य है। आप इसे मैन्युअल रूप से आज़मा सकते हैं:

>>> dis = DistanceFrom(10) 
>>> print dis(10), dis(5), dis(0) 
0 5 10 
>>> 

आपकी सूची में प्रत्येक आइटम के लिए कौन सा काम करता है और सॉर्ट कुंजी के रूप में लौटाए गए मान का उपयोग करता है। इस उदाहरण में आपको 10 सबसे पहले की वस्तुओं के साथ एक सूची वापस मिल जाएगी, और अंत में एक और आगे की ओर जाएगा।

+0

आह। यह अच्छा है। – user225312

+0

@user: आपका उत्तर सही था, लेकिन मैंने gnibbler के जवाब को स्वीकार कर लिया क्योंकि यह शुरुआती लोगों के लिए खोजे जाने पर फायदेमंद होगा। – user225312

1

जब आप कुछ कहते हैं तो इसका मतलब है कि आप इसे एक मूल्य वापस करने की उम्मीद कर रहे हैं। जब आप एक वर्ग बनाते हैं जिसमें __call__ विधि परिभाषित होती है, तो आप यह निर्देश दे रहे हैं कि उस वर्ग का एक उदाहरण फ़ंक्शन के रूप में व्यवहार कर सकता है।

इस सवाल के प्रयोजन के लिए, इस:

def distance_from(origin, other): 
    return abs(other - origin) 

सॉर्ट करने के लिए key तर्क के रूप में, यहाँ विवरण अजगर प्रलेखन से सीधे है:

class DistanceFrom(object): 
     def __init__(self, origin): 
      self.origin = origin 
     def __call__(self, x): 
      return abs(x - self.origin) 

कार्यात्मक के बराबर है:

कुंजी निर्दिष्ट करता है एक तर्क का एक फ़ंक्शन जिसका उपयोग प्रत्येक सूची तत्व से तुलना कुंजी निकालने के लिए किया जाता है: key=str.lower।डिफ़ॉल्ट मान कोई नहीं

1

जब भी मुझे लगता है कि मैं मूलभूत सिद्धांतों को समझ नहीं पा रहा हूं तो पाइथन दस्तावेज़ काफी अच्छे हैं। मैं इन्हें Google के साथ स्थित करता हूं।

The key parameter एक ऐसा फ़ंक्शन है जो सॉर्ट सूची के तत्वों पर कॉल करेगा। मैं इस दस्तावेज़ को sort site:http://docs.python.org/ पर गुगल करके और फिर key= खोज रहा हूं।

__call__ एक ऐसा फ़ंक्शन है जिसे आप किसी ऑब्जेक्ट में जोड़ सकते हैं ताकि उस ऑब्जेक्ट को कॉल करने योग्य बनाया जा सके जैसे कि यह एक फ़ंक्शन था। मुझे इस दस्तावेज़ को __call__ site:http://docs.python.org/ पर गुगल करके और फिर __call__ के लिए दस्तावेज़ के लिंक का पालन करके मिला।

+0

मैं समझता हूं कि वे क्या हैं, मेरा प्रश्न इस उदाहरण के लिए विशिष्ट था। – user225312

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