2012-04-27 13 views
53

सबकुछ पढ़ने के बाद मैं लैम्ब्डा पर पा सकता हूं, मुझे अभी भी समझ में नहीं आता कि मैं इसे क्या करना चाहता हूं।पाइथन में लैम्ब्डा को समझना और एकाधिक तर्कों को पारित करने के लिए इसका उपयोग करना

lambda x, y : x + y 

तुम दोनों क्यों x और y: से पहले राज्य के लिए की जरूरत है:

हर कोई उदाहरण का उपयोग करता है? इसके अलावा आप इसे कई तर्क कैसे वापस कर सकते हैं?

उदाहरण के लिए

:

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1)) 

यह सिर्फ ठीक काम करता है। लेकिन निम्नलिखित कोड ऐसा नहीं करता:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1)) 

यह त्रुटि पैदावार:

TypeError:() takes no arguments (1 given)

उत्तर

87

Why do you need to state both 'x' and 'y' before the ':'?

एक समारोह, बस लिखा इनलाइन के रूप में ही। आपका उदाहरण सिर्फ एक नाम करने के लिए इसे f तरह बंधन के बिना

def f(x, y) : return x + y 

के बराबर है।

Also how do you make it return multiple arguments?

फ़ंक्शन के साथ ही वैसे ही। अधिमानतः, आप एक ट्यूपल लौटाते हैं:

lambda x, y: (x+y, x-y) 

या कोई सूची, या कक्षा, या जो भी हो।

self.entry_1.bind के साथ चीज़ का उत्तर Demosthenex द्वारा किया जाना चाहिए।

+2

वास्तव में उनमें से कम से कम बिट प्राप्त करने के लिए, आप कुछ कार्यात्मक प्रोग्रामिंग आज़मा सकते हैं, जो आपको समझने के लिए एक शानदार अनुभव है, और शायद आपको एक बेहतर प्रोग्रामर बना देगा। – phg

9

मेरा मानना ​​है कि बाँध हमेशा एक घटना पैरामीटर भेजने का प्रयास करता। आज़माएं:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1)) 

आप पैरामीटर स्वीकार करते हैं और इसका कभी भी उपयोग नहीं करते हैं।

+0

ओएमजी, मैं उस पर बहुत लंबे समय से काम कर रहा था और फिर मुझे 1 मिनट के फ्लैट में एक कामकाजी जवाब मिल गया ... बीटीडब्ल्यू, क्या आप जानते हैं कि चीजें कॉलन के सामने क्यों जाती हैं? – Talisin

+2

क्योंकि वे _fuction पैरामीटर_ हैं। – phg

+2

आप इसे "डिफ़ॉल्ट = कोई भी" डिफ़ॉल्ट मान देने के लिए भी कोशिश कर सकते हैं, फिर फ़ंक्शन का उपयोग बाइंड और बटन के लिए किया जा सकता है। स्पष्टीकरण के लिए – Demosthenex

5

Why do you need to state both x and y before the : ?

क्योंकि यह एक समारोह परिभाषा है और यह क्या समारोह पैरामीटर स्वीकार करता है, और किस क्रम में पता करने के लिए की जरूरत है। यह केवल अभिव्यक्ति को नहीं देख सकता है और उसमें चर नामों का उपयोग नहीं कर सकता है, क्योंकि उनमें से कुछ नाम आप मौजूदा स्थानीय या वैश्विक चर मानों का उपयोग करना चाहते हैं, और यहां तक ​​कि अगर ऐसा होता है, तो यह नहीं पता होगा कि यह किस क्रम में है उन्हें प्राप्त करने की उम्मीद करनी चाहिए।

आपका त्रुटि संदेश का अर्थ है कि टी आपके लैम्बडा को एक तर्क के साथ बुला रहा है, जबकि आपका लैम्ब्डा कोई तर्क स्वीकार करने के लिए लिखा गया है। अगर आपको तर्क की आवश्यकता नहीं है, तो बस एक स्वीकार करें और इसका उपयोग न करें। क्योंकि एक लैम्ब्डा (धारणात्मक) है (Demosthenex has the code, मैं इसे पोस्ट होता है, लेकिन यह करने के लिए पीटा गया था।)

+0

धन्यवाद। मुझे लगता है कि मैं आखिरकार इस के चारों ओर अपना सिर ले रहा हूं। – Talisin

2

Why do you need to state both 'x' and 'y' before the ':'?

आप कर सकते थे वास्तव में कुछ स्थितियों में (आप केवल एक तर्क है जब) से पहले x और y डाल नहीं ":"।

>>> flist = [] 
>>> for i in range(3): 
...  flist.append(lambda : i) 

लेकिन लैम्ब्डा में मैं नाम से बाध्य किया जाएगा, ताकि,

>>> flist[0]() 
2 
>>> flist[2]() 
2 
>>> 

तुम क्या चाहते हो सकता है से अलग।

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