दिलचस्प पोस्ट
क्षैतिज स्क्रॉलबार के बिना बूटस्ट्रैप 3 द्रव लेआउट कैसे बनाया जाए प्रकार के मूल्य 'मेमे!' को परिवर्तित नहीं किया जा सकता अपेक्षित तर्क प्रकार '@ noescape (मेे) फेंकता है -> बाल' डिफ़ॉल्ट: सीएसएस के साथ लक्ष्य Wkhtmltopdf के साथ HTML से Google वेब फ़ॉन्ट्स और पीडीएफ पीढ़ी जावा लैम्डा स्ट्रीम () विशिष्ट मनमानी कुंजी पर? असतत एक्स पैमाने का क्रम बदलें मैं जीआईटी रिपॉजिटरी के भीतर एक मौजूदा गिट सबपलोड को कैसे स्थानांतरित करूं? जावास्क्रिप्ट सेटइनर्वर सर्वर-साइड पर प्लूपलोड के चुने हुए अपलोड को संभालना आदेशों का अनुक्रम भेजना और प्रतिक्रिया की प्रतीक्षा करना क्या cout सिंक्रनाइज़ / धागा-सुरक्षित है? SQL Server 2008 का उपयोग कर IDENTITY_INSERT चालू और बंद कैसे करें? कुछ "उपज" समझने में सहायता करते हैं AsyncTask एंड्रॉइड उदाहरण IIS WCF सेवा होस्टिंग बनाम विन्डोज सर्विस

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

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

# 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))