2012-12-02 20 views
28

हल कर, योग जैसे कुछ बिल्ट-इन कार्य का उपयोग करते समय ... मैं key=lambdaक्या महत्वपूर्ण है = लैम्ब्डा

लैम्ब्डा क्या है के उपयोग पर ध्यान? यह कैसे काम करता है?

अन्य फ़ंक्शन कुंजी = लैम्ब्डा का उपयोग करते हैं?

वहाँ की तरह किसी भी अन्य कुंजी मान रहे हैं, key=?

+0

इस मामले में 'key' एक कीवर्ड तर्क है और 'lambda' के साथ कुछ लेना देना नहीं है। – l4mpi

+0

इसे देखें: http://stackoverflow.com/questions/8966538/syntax-behind-sortedkey-lambda – sachinjain024

उत्तर

57

एक lambda एक गुमनाम समारोह है:

>>> f = lambda: 'foo' 
>>> print f() 
foo 

यह अक्सर इस तरह के sorted() रूप में कार्य करता है कि एक पैरामीटर के रूप में एक प्रतिदेय लेने में प्रयोग किया जाता है (अक्सर key कीवर्ड पैरामीटर)। आप lambda की बजाय एक मौजूदा फ़ंक्शन भी प्रदान कर सकते हैं, जब तक कि यह एक कॉल करने योग्य ऑब्जेक्ट हो।

उदाहरण के रूप में sorted() function लें। यह क्रमबद्ध क्रम में iterable दिया वापसी करेंगे:

>>> sorted(['Some', 'words', 'sort', 'differently']) 
['Some', 'differently', 'sort', 'words'] 

लेकिन प्रकार शब्द कि लोवरकेस कर रहे हैं इससे पहले कि uppercased शब्द है। key कीवर्ड का उपयोग करके आप प्रत्येक प्रविष्टि को बदल सकते हैं ताकि इसे अलग-अलग क्रमबद्ध किया जा सके। हम छँटाई करने से पहले सभी शब्द लोअरकेस सकता है उदाहरण के लिए:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower()) 
    File "<stdin>", line 1 
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower()) 
                 ^
SyntaxError: invalid syntax 

एक lambda:

>>> def lowercased(word): return word.lower() 
... 
>>> lowercased('Some') 
'some' 
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased) 
['differently', 'Some', 'sort', 'words'] 

हम उस के लिए एक अलग समारोह बनाने के लिए किया था, हम sorted() अभिव्यक्ति में def lowercased() लाइन इनलाइन नहीं कर सका दूसरी ओर, सीधे निर्दिष्ट किया जा सकता, sorted() अभिव्यक्ति में इनलाइन:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower()) 
['differently', 'Some', 'sort', 'words'] 

लैम्ब्डा केवल एक अभिव्यक्ति तक सीमित हैं, जिसके परिणामस्वरूप वापसी मूल्य है।

पाइथन लाइब्रेरी में बहुत सारे स्थान हैं, जिनमें अंतर्निहित फ़ंक्शंस शामिल हैं, जो कीवर्ड या स्थितित्मक तर्क के रूप में कॉल करने योग्य होते हैं। यहां नाम देने के लिए बहुत सारे लोग हैं, और वे अक्सर एक अलग भूमिका निभाते हैं।

8

लैम्ब्डा कोई भी कार्य हो सकता है।

sorted(personArray, key=compare_person) 

इस तरह, सूची में उम्र के अनुसार क्रमबद्ध किया जाएगा: यदि आप एक समारोह

def compare_person(a): 
     return a.age 

था आप व्यक्ति की एक सूची इस तरह (जो एक उम्र विशेषता होने के प्रत्येक) को सॉर्ट कर सकता है तो आरोही क्रम।

पैरामीटर को लैम्ब्डा कहा जाता है क्योंकि पाइथन में फ्लाई पर ऐसे कार्यों को परिभाषित करने के लिए निफ्टी लैम्ब्डा कीवर्ड हैं। फ़ंक्शन compar_person को परिभाषित करने और सॉर्ट करने के लिए इसे पास करने के बजाय, आप यह भी लिख सकते हैं:

sorted(personArray, key=lambda a: a.age) 

जो वही काम करता है।

3
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower()) 

वास्तव में, इसके बाद के संस्करण कोड हो सकता है: कुंजी = str.lower:

>>> sorted(['Some','words','sort','differently'],key=str.lower) 

https://docs.python.org/2/library/functions.html?highlight=sorted#sorted के अनुसार, कुंजी एक तर्क के एक समारोह है कि प्रत्येक सूची तत्व से एक तुलना कुंजी को निकालने के लिए प्रयोग किया जाता है निर्दिष्ट करता है । डिफ़ॉल्ट मान कोई नहीं है (सीधे तत्वों की तुलना करें)।

2

अजगर में, लैम्ब्डा एक कीवर्ड अनाम प्रक्रियाएं (कोई नाम के साथ काम करता है) परिभाषित किया जाता है और यही कारण है कि वे लैम्ब्डा कार्यों रूप में जाना जाता है।

मूल रूप से यह अनाम प्रक्रियाएं परिभाषित करने के लिए प्रयोग किया जाता है कि/तर्क (रों) और डेटा/अभिव्यक्ति के रिटर्न मूल्य नहीं ले जा सकते कर सकते हैं। आइए उदाहरण देखें।

>>> # Defining a lambda function that takes 2 parameters(as integer) and returns their sum 
... 
>>> lambda num1, num2: num1 + num2 
<function <lambda> at 0x1004b5de8> 
>>> 
>>> # Let's store the returned value in variable & call it(1st way to call) 
... 
>>> addition = lambda num1, num2: num1 + num2 
>>> addition(62, 5) 
67 
>>> addition(1700, 29) 
1729 
>>> 
>>> # Let's call it in other way(2nd way to call, one line call) 
... 
>>> (lambda num1, num2: num1 + num2)(120, 1) 
121 
>>> (lambda num1, num2: num1 + num2)(-68, 2) 
-66 
>>> (lambda num1, num2: num1 + num2)(-68, 2**3) 
-60 
>>> 

अब मुझे अपने सवाल का एक जवाब दे। पहला उत्तर भी बढ़िया है। यह एक और उदाहरण के साथ व्याख्या करने का मेरा तरीका है।

मान लीजिए हम एक (पूर्णांकों और संख्यात्मक सामग्री साथ तार) के रूप में

nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"] 

आइटम की सूची, है और मैं अनुसार क्रमबद्ध() समारोह का उपयोग कर इसे सुलझाने के लिए चाहते हैं, की सुविधा देता है जो देखते हैं हो जाता।

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"] 
>>> sorted(nums) 
[1, 3, 4, '-1', '-10', '2', '5', '8'] 
>>> 

यह मुझे नहीं दिया मैं क्या उम्मीद के रूप में मैं नीचे की तरह चाहता था,

['-10', '-1', 1, '2', 3, 4, '5', '8'] 

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

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"] 
>>> sorted(nums, key=int) 
['-10', '-1', 1, '2', 3, 4, '5', '8'] 
>>> 

कुंजी

>>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"] 
>>> names2 = sorted(names) 
>>> names2 
['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep'] 
>>> # But I don't want this o/p(here our intention is to treat 'a' same as 'A') 
... 
>>> names3 = sorted(names, key=lambda name:name.lower()) 
>>> names3 
['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra'] 
>>> 

के एक मूल्य (प्रतिदेय) और कुंजी के मूल्य के रूप में इसे प्रदान आप अपनी खुद की समारोह के रूप में परिभाषित कर सकते हैं देता है उपयोग लैम्ब्डा समारोह।

प्रिय programers, मैं तुम्हारे लिए नीचे दिए गए कोड में लिखा है, बस करने की कोशिश को समझने यह और टिप्पणी अपने स्पष्टीकरण।मुझे आपकी व्याख्या देखने में खुशी होगी (यह आसान है)।

>>> def validator(item): 
...  try: 
...   return int(item) 
...  except: 
...   return 0 
... 
>>> sorted(['gurmit', "0", 5, 2, 1, "front", -2, "great"], key=validator) 
[-2, 'gurmit', '0', 'front', 'great', 1, 2, 5] 
>>> 

मैं आशा यह उपयोगी होगा।

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