नीचे प्रश्न में कोड की पंक्ति है:
a = lambda _:True
यह एक इनपुट पैरामीटर वाला फ़ंक्शन बनाता है _
:। अंडरस्कोर चर नाम का एक अजीब विकल्प है, लेकिन यह सिर्फ एक चर नाम है। आप _
कहीं भी उपयोग कर सकते हैं , तब भी जब लैम्बडा फ़ंक्शंस का उपयोग नहीं कर रहे हों। उदाहरण के लिए, इसके बजाय ...।
my_var = 5
print(my_var)
आप लिख सकते हैं:
_ = 5
print(_)
हालाँकि, एक कारण _
था जो कुछ के बजाय x
या जैसे पैरामीटर नाम के नाम के रूप में उपयोग किया जाता था input
। हम एक पल में मिल जाएगा।
सबसे पहले, हमें यह जानना होगा कि लैम्ब्डा-कीवर्ड एक फ़ंक्शन का निर्माण करता है def
, लेकिन समान सिंटैक्स के साथ। लैम्ब्डा फ़ंक्शन की परिभाषा, a = lambda _:True
लेखन के समान है:
def a(_):
return True
यह a
एक इनपुट पैरामीटर के साथ एक फ़ंक्शन बनाता है _
, और यह वापस आ जाता है True
। एक अंडरस्कोर के बजाय a = lambda x:True
एक आसानी से लिखा जा सकता है x
। हालाँकि, कन्वेंशन को _
वैरिएबल नाम के रूप में उपयोग करना है जब हम उस वैरिएबल का उपयोग करने का इरादा नहीं रखते हैं। निम्नलिखित को धयान मे रखते हुए:
for _ in range(1, 11):
print('pear')
ध्यान दें कि लूप इंडेक्स का उपयोग लूप-बॉडी के अंदर कभी नहीं किया जाता है। हम चाहते हैं कि लूप कई बार निर्दिष्ट संख्या को निष्पादित करे। जैसा winklerrr
कि लिखा है, "परिवर्तनशील नाम _
[...]" फेंक-दूर-चर "की तरह है, बस एक प्लेसहोल्डर है जो किसी काम का नहीं है।"
इसी तरह, `` a = लैंबडा x:
फंक्शन के बॉडी के अंदर इनपुट पैरामीटर का उपयोग नहीं किया जाता है। यह वास्तव में मायने नहीं रखता कि इनपुट तर्क क्या है, जब तक कि एक है। उस लैम्बडा-फंक्शन के लेखक ने _
कुछ इस तरह लिखा था जैसे x
कि यह इंगित करना कि चर का उपयोग नहीं किया जाएगा।
ध्यान दें कि लैम्ब्डा है एक तर्क है, इसलिए, लेखन
a()
, एक त्रुटि बढ़ाएगा।
अगर आप बिना किसी तर्क के एक लंबोदर चाहते हैं तो कुछ इस तरह लिखें:
bar = lambda: True
अब कॉलिंग bar()
, बिना किसी आर्ग के, ठीक काम करेगा। एक लंबोदर जो कोई तर्क नहीं लेता है, उसे हमेशा एक ही मूल्य वापस करने की आवश्यकता नहीं होती है:
import random
process_fruit = lambda : random.random()
ऊपर लैंबडा फ़ंक्शन अधिक जटिल है कि बस एक ऐसी चीज जो हमेशा एक ही स्थिर लौटाती है।
एक कारण यह है कि प्रोग्रामर कभी-कभी हमें उन कार्यों के लिए lambda
कीवर्ड def
करते हैं जो विशेष रूप से लघु और सरल हैं। ध्यान दें कि एक lambda
परिभाषा आमतौर पर सभी को एक पंक्ति में फिट कर सकती है, जबकि, एक डीफ स्टेटमेंट के साथ ऐसा करना मुश्किल है। एसएफ के lambda
बजाय उपयोग करने का एक और कारण def
जब फ़ंक्शन फिर से उपयोग नहीं किया जाएगा। यदि हम फ़ंक्शन को बाद में फिर से कॉल नहीं करना चाहते हैं, तो फ़ंक्शन को नाम देने की कोई आवश्यकता नहीं है। उदाहरण के लिए निम्नलिखित कोड पर विचार करें:
def apply_to_each (बदलना, in_container): out_container = list () idx के लिए, enumerate में आइटम (कंटेनर, 0): out_container [idx] = transform (आइटम) return -container
अब हम निम्नलिखित कॉल करते हैं:
squares = apply_to_each(lambda x: x**2 range(0, 101))
ध्यान दें कि lambda x: x**2
एक लेबल नहीं दिया गया है। ऐसा इसलिए है क्योंकि हम शायद इसे बाद में फिर से कॉल नहीं करेंगे, यह सिर्फ कुछ छोटा और सरल था जिसकी हमें अस्थायी रूप से आवश्यकता थी।
तथ्य यह है कि लैम्ब्डा कार्यों की आवश्यकता नहीं है, उन्हें वर्णन करने के लिए एक और नाम का स्रोत है: "अनाम फ़ंक्शन।"
यह भी ध्यान दें कि लैम्ब्डा-स्टेटमेंट एक फंक्शन-कॉल की तरह हैं जिसमें वे अपने द्वारा बनाए गए फंक्शन का संदर्भ देते हैं। निम्नलिखित अवैध है:
apply_to_each(def foo(x): x**2 , range(0, 101))
जबकि, apply_to_each(lambda x: x**2 range(0, 101))
अभी ठीक है।
इसलिए, जब हम कुछ छोटा, मीठा चाहते हैं तो हम लंबे वेरिएबल नाम के बजाय और उपयोग lambda
करते हैं def
और _
बाद में फिर से उपयोग नहीं करना चाहेंगे।
lambda : True