दिलचस्प पोस्ट
printf विसंगति के बाद "कांटा ()" उपयोग स्कीमा के उपयोग से एक सूची स्वत: तारों को NoSuchBeanDefinitionException प्रदान करता है वीआईएम अक्षम स्वचालित न्यूलाइन फाइल का अंत सी # में पैसे के लिए उपयोग करने के लिए सबसे अच्छा डेटा प्रकार क्या है? Accordion तालिका सेल – कैसे गतिशील विस्तार / अनुबंध uitableviewcell करने के लिए? पायथन में उपयोग करने के लिए कौन सा बेहतर है: लैम्ब्डा फ़ंक्शंस या नेस्टेड फ़ंक्शंस ('डीईएफ')? सी में शब्दकोश को लागू करने का त्वरित तरीका कैसे पीएचपी में सरल एक को एक "बहु-आयामी सरणी" को "समतल" करना है? रिपॉजिटरी और सर्विस लेयर के बीच का अंतर? गतिशील डेटा के साथ जेसनॉन JSON.NET का उपयोग करने के लिए Deserializing आप vb.net में HTML को कैसे पार्स करते हैं मैं किसी सी # अनाम प्रकार को एक JSON स्ट्रिंग में कैसे सीरियल कर सकता हूं? ADO.NET DataTable को एक HTML तालिका पोस्ट करें एंड्रॉइड एमुलेटर पर Google मानचित्र v2 चलाना Android में एक सेवा के माध्यम से जीपीएस स्थान प्राप्त करें

पायथन लैम्ब्डा एक लूप में

निम्न कोड स्निपेट को ध्यान में रखते हुए:

# directorys == {'login': <object at ...>, 'home': <object at ...>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d)) 

मैं निम्न के रूप में दो फ़ंक्शन का एक शब्दकोश बनाने की अपेक्षा करता हूं:

 # Expected : self.command == { "cd login": lambda: self.root.change_directory("login"), "cd home": lambda: self.root.change_directory("home") } 

लेकिन ऐसा लगता है कि उत्पन्न दो लैम्ब्डा फ़ंक्शन बिल्कुल समान हैं:

 # Result : self.command == { "cd login": lambda: self.root.change_directory("login"), "cd home": lambda: self.root.change_directory("login") # <- Why login ? } 

मुझे सच में समझ में नहीं आता क्यों क्या तुम्हारे पास कोई सुझाव है ?

वेब के समाधान से एकत्रित समाधान "पायथन लैम्ब्डा एक लूप में"

आपको प्रत्येक फ़ंक्शन के लिए डी बांधने की आवश्यकता है। ऐसा करने का एक तरीका यह है कि उसे एक डिफ़ॉल्ट मान के साथ एक पैरामीटर के रूप में देना है:

 lambda d=d: self.root.change_directory(d) 

अब फ़ंक्शन के अंदर डी पैरामीटर का उपयोग करता है, भले ही उसका एक ही नाम हो, और फ़ंक्शन बनने पर उसके लिए डिफ़ॉल्ट मान का मूल्यांकन किया जाता है। यह देखने में आपकी सहायता के लिए:

 lambda bound_d=d: self.root.change_directory(bound_d) 

याद रखें कि डिफ़ॉल्ट मान कैसे काम करते हैं, जैसे कि अदला-बदली वस्तुएं जैसे कि सूचियों और दिशानिर्देश, क्योंकि आप ऑब्जेक्ट बाध्यकारी हैं।

डिफ़ॉल्ट मूल्यों के साथ पैरामीटर की यह मुहिम काफी आम है, लेकिन यदि आप फ़ंक्शन मापदंडों को आत्मनिर्भर करते हैं और यह तय करते हैं कि उनकी मौजूदगी के आधार पर क्या करना है तो यह विफल हो सकता है। आप पैरामीटर से दूसरे बंद होने से बच सकते हैं:

 (lambda d=d: lambda: self.root.change_directory(d))() # or (lambda d: lambda: self.root.change_directory(d))(d) 

बेहतर अभी तक, आप "कमांड" कैसे संभालते हैं इसका एक नया डिज़ाइन यहां मदद करेगा और कहीं और मदद कर सकता है।

यह उस बिंदु के कारण है जिस पर घ बंधी हो रही है। लैम्ब्डा फ़ंक्शन के वर्तमान बिंदु के बजाय चर d पर सभी बिंदुओं का कार्य करता है, इसलिए जब आप अगले चलना में d अद्यतन करते हैं, तो यह अद्यतन आपके सभी कार्यों में देखा जाता है।

एक सरल उदाहरण के लिए:

 funcs = [] for x in [1,2,3]: funcs.append(lambda: x) for f in funcs: print f() # output: 3 3 3 

आप इसके आस-पास एक अतिरिक्त फ़ंक्शन जोड़कर इसे प्राप्त कर सकते हैं, जैसे:

 def makeFunc(x): return lambda: x funcs = [] for x in [1,2,3]: funcs.append(makeFunc(x)) for f in funcs: print f() # output: 1 2 3 

आप लैम्ब्डा अभिव्यक्ति के अंदर स्क्रॉपिंग को भी ठीक कर सकते हैं

 lambda bound_x=x: bound_x 

हालांकि सामान्य तौर पर यह अच्छा अभ्यास नहीं है जैसा आपने अपने फ़ंक्शन के हस्ताक्षर को बदल दिया है।

मैं एक ही समस्या से मिला चयनित समाधान ने मुझे बहुत मदद की, लेकिन मुझे एक प्रश्न को कार्यात्मक बनाने के लिए एक सटीक जोड़ना आवश्यक है: लूप के बाहर लैम्ब्डा फ़ंक्शन को परिभाषित करें। वैसे, डिफ़ॉल्ट मान आवश्यक नहीं है।

 foo = lambda d: lambda : self.root.change_directory(d) for d in directorys: self.command["cd " + d] = (foo(d))