अजगर में मेमने को समझना और कई तर्कों को पारित करने के लिए इसका उपयोग करना


90

सब कुछ पढ़ने के बाद जो मुझे लंबोदर पर मिल सकता है, मुझे अभी भी समझ नहीं आया कि मैं इसे कैसे बनाऊं जो मैं चाहता हूं।

हर कोई उदाहरण का उपयोग करता है:

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: () कोई तर्क नहीं देता (1 दिया)

जवाबों:


135

आपको ':' से पहले 'x' और 'y' दोनों को बताने की आवश्यकता क्यों है?

क्योंकि एक लंबोदर (वैचारिक रूप से) एक फ़ंक्शन के समान है, बस इनलाइन लिखा गया है। आपके उदाहरण के बराबर है

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

जैसे बिना किसी नाम के इसे बांधना f

यह भी कि आप इसे कई तर्क कैसे लौटाते हैं?

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

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

या एक सूची, या एक वर्ग, या जो भी हो।

के साथ बात self.entry_1.bindDemosthenex द्वारा जवाब दिया जाना चाहिए।


2
वास्तव में उनमें से कम से कम बिट प्राप्त करने के लिए, आप कुछ कार्यात्मक प्रोग्रामिंग की कोशिश कर सकते हैं, जो एक भयानक अनुभव है जब आप इसे समझना शुरू करते हैं, और संभवत: आपको एक बेहतर प्रोग्रामर बना देगा। </ प्रोपगैंडा>
phipsgabler

3
तुम मेरे भगवान हो और तुम्हारा प्रचार मेरी रोजी रोटी है। फिर भी, मैंने इसे टपल पर लागू करने की कोशिश की: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))और ऐसा लगता है कि यह काम नहीं करता है। कृपया, मेरी आत्मा को प्रक्रियात्मक कार्यक्रम की धुंध से बचाएं
मोनिका

@RevolucionforMonica एक एक देर से उत्तर के सा, लेकिन यहाँ यह कैसे करना है की एक अजगर 3 आरईपीएल कोड उदाहरण है: repl.it/@foobar123/ScarceWhimsicalMainframe
जन डॉट नेट

11

मेरा मानना ​​है कि बाइंड हमेशा इवेंट पैरामीटर भेजने की कोशिश करता है। प्रयत्न:

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

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


omg, मैं इतने लंबे समय से उस पर काम कर रहा था और फिर मुझे 1 मिनट के फ्लैट में काम करने का जवाब मिलता है ... Btw, क्या आप जानते हैं कि कॉलन के सामने चीजें क्यों जाती हैं?
तालीसिन

2
क्योंकि वे फ्यूजन पैरामीटर हैं
phipsgabler

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

5

आपको पहले xऔर yबाद में दोनों को बताने की आवश्यकता क्यों है :?

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

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


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

3

आपको ':' से पहले 'x' और 'y' दोनों को बताने की आवश्यकता क्यों है?

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

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

लेकिन मेमने में मैं नाम से बंधूंगा,

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

आप जो चाहते हैं उससे अलग हो सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.