:=
पायथन 3.8 में जोड़ा गया असाइनमेंट एक्सप्रेशन ऑपरेटर लैम्ब्डा एक्सप्रेशन के अंदर असाइनमेंट का समर्थन करता है। यह ऑपरेटर सिंटिक कारणों के लिए केवल एक कोष्ठक (...)
, कोष्ठक [...]
या लट में {...}
अभिव्यक्ति के भीतर प्रकट हो सकता है। उदाहरण के लिए, हम निम्नलिखित लिख सकेंगे:
import sys
say_hello = lambda: (
message := "Hello world",
sys.stdout.write(message + "\n")
)[-1]
say_hello()
पायथन 2 में, सूची बोध के साइड इफेक्ट के रूप में स्थानीय असाइनमेंट करना संभव था।
import sys
say_hello = lambda: (
[None for message in ["Hello world"]],
sys.stdout.write(message + "\n")
)[-1]
say_hello()
हालाँकि, आपके उदाहरण में इनमें से किसी एक का उपयोग करना संभव नहीं है क्योंकि आपका चर flag
एक बाहरी दायरे में है, न कि lambda
गुंजाइश। इसका कोई मतलब नहीं है lambda
, यह Python 2 में सामान्य व्यवहार है। Python 3 आपको s के nonlocal
अंदर कीवर्ड के साथ इसे प्राप्त करने देता है def
, लेकिन nonlocal
इसका उपयोग lambda
s के अंदर नहीं किया जा सकता है ।
वर्कअराउंड है (नीचे देखें), लेकिन जब हम विषय पर हों ...
कुछ मामलों में आप इसका उपयोग सब कुछ अंदर करने के लिए कर सकते हैं lambda
:
(lambda: [
['def'
for sys in [__import__('sys')]
for math in [__import__('math')]
for sub in [lambda *vals: None]
for fun in [lambda *vals: vals[-1]]
for echo in [lambda *vals: sub(
sys.stdout.write(u" ".join(map(unicode, vals)) + u"\n"))]
for Cylinder in [type('Cylinder', (object,), dict(
__init__ = lambda self, radius, height: sub(
setattr(self, 'radius', radius),
setattr(self, 'height', height)),
volume = property(lambda self: fun(
['def' for top_area in [math.pi * self.radius ** 2]],
self.height * top_area))))]
for main in [lambda: sub(
['loop' for factor in [1, 2, 3] if sub(
['def'
for my_radius, my_height in [[10 * factor, 20 * factor]]
for my_cylinder in [Cylinder(my_radius, my_height)]],
echo(u"A cylinder with a radius of %.1fcm and a height "
u"of %.1fcm has a volume of %.1fcm³."
% (my_radius, my_height, my_cylinder.volume)))])]],
main()])()
10.0 सेमी की त्रिज्या और 20.0 सेमी की ऊंचाई वाले सिलेंडर में 6283.2 सेमी³ की मात्रा होती है।
20.0 सेमी की त्रिज्या और 40.0 सेमी की ऊंचाई वाले सिलेंडर में 50265.5 सेमी³ की मात्रा होती है।
30.0 सेमी की त्रिज्या और 60.0 सेमी की ऊंचाई वाले सिलेंडर में 169646.0 सेमी³ की मात्रा होती है।
कृपया नहीं।
... अपने मूल उदाहरण पर वापस: यद्यपि आप flag
बाहरी दायरे में चर को असाइनमेंट नहीं कर सकते हैं, आप पहले से असाइन किए गए मान को संशोधित करने के लिए फ़ंक्शन का उपयोग कर सकते हैं।
उदाहरण के लिए, flag
एक वस्तु हो सकती है जिसका .value
हम उपयोग करते हैं setattr
:
flag = Object(value=True)
input = [Object(name=''), Object(name='fake_name'), Object(name='')]
output = filter(lambda o: [
flag.value or bool(o.name),
setattr(flag, 'value', flag.value and bool(o.name))
][0], input)
[Object(name=''), Object(name='fake_name')]
यदि हम उपरोक्त विषय को फिट करना चाहते हैं, तो हम इसके बजाय एक सूची समझ का उपयोग कर सकते हैं setattr
:
[None for flag.value in [bool(o.name)]]
लेकिन वास्तव में, गंभीर कोड में आपको हमेशा एक नियमित फ़ंक्शन परिभाषा का उपयोग करना चाहिए lambda
यदि आप बाहरी असाइनमेंट करने जा रहे हैं।
flag = Object(value=True)
def not_empty_except_first(o):
result = flag.value or bool(o.name)
flag.value = flag.value and bool(o.name)
return result
input = [Object(name=""), Object(name="fake_name"), Object(name="")]
output = filter(not_empty_except_first, input)