वैकल्पिक समाधान के रूप में, आप आंशिक फ़ंक्शन का उपयोग कर सकते हैं:
>>> bases = [(lambda i: lambda x: x**i)(i) for i in range(3)]
>>> print([b(5) for b in bases])
[1, 5, 25]
@unutbu द्वारा दिए गए क्लासिक समाधान से अधिक है कि निर्माण के केवल लाभ यह है कि जिस तरह से है, तो आप तर्कों की गलत संख्या के साथ अपने कार्यप्रणाली को कॉल करके डरपोक बग प्रस्तुत नहीं कर सकते हैं:
>>> print([b(5, 8) for b in bases])
# ^^^
# oups
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
TypeError: <lambda>() takes 1 positional argument but 2 were given
एक टिप्पणी bellow में एडम स्मिथ ने सुझाव दिया, "नेस्ट लैम्ब्डा" उपयोग करने के बजाय आप एक ही लाभ के साथ functools.partial
इस्तेमाल कर सकते हैं के रूप में:
>>> import functools
>>> bases = [functools.partial(lambda i,x: x**i,i) for i in range(3)]
>>> print([b(5) for b in bases])
[1, 5, 25]
>>> print([b(5, 8) for b in bases])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
TypeError: <lambda>() takes 2 positional arguments but 3 were given
स्रोत
2015-02-01 22:12:53
आप इस सहायक हो सकते हैं: [पकड़ लिया: अजगर, scoping, और संवृति] (http://eev.ee/blog/2011/04/24/gotcha-python-scoping-closures/) – unutbu
unutbu : इसे कैसे काम करना है इस पर कोई विचार? – L3viathan
शायद आप जो चाहते हैं वह है 'बेस = लैम्ब्डा x: [x ** मैं रेंज में (3)] '? – user3467349