← Back

Home › Hindi › Python lambda Hindi में

Python Lambda — छोटा anonymous function, और इसकी हद

🌐 यह page Hindi में है · Read the English functions guide →

lambda बनाम defsorted() के key मेंfilter और mapकब lambda नहीं

Lambda क्या है

Lambda एक बिना नाम वाला function है जो सिर्फ एक expression रख सकता है। return लिखने की ज़रूरत नहीं — expression का नतीजा अपने आप return हो जाता है।

# दोनों बराबर हैं
def square_def(n):
    return n * n

square_lambda = lambda n: n * n

print(square_def(5), square_lambda(5))     # 25 25

# कोई argument नहीं, या कई arguments
zero = lambda: 0
add = lambda a, b: a + b
print(zero(), add(3, 4))                   # 0 7

सबसे बड़ी हद: lambda में सिर्फ एक expression आ सकता है। if statement, for loop, assignment या कई line का काम lambda में नहीं हो सकता — वहाँ def ही लिखो।

असली use — sorted() और min/max के key में

यही lambda का सबसे काम का जगह है। key में एक function चाहिए जो हर item से एक तुलना-योग्य value निकाले:

students = [
    {"name": "Asha", "marks": 91},
    {"name": "Ravi", "marks": 78},
    {"name": "Meena", "marks": 85},
]

print(sorted(students, key=lambda s: s["marks"]))            # marks बढ़ते क्रम में
print(sorted(students, key=lambda s: s["marks"], reverse=True))  # घटते क्रम में
print(max(students, key=lambda s: s["marks"])["name"])       # Asha
print(min(students, key=lambda s: len(s["name"]))["name"])   # Ravi

words = ["banana", "kiwi", "apple"]
print(sorted(words, key=len))                                # length के हिसाब से
print(sorted(words, key=str.lower))                          # case की परवाह किए बिना

ध्यान रहेगा आखिरी दो examples पर: key=len में lambda की ज़रूरत ही नहीं — सीधे built-in function पास कर सकते हो। lambda x: len(x) लिखना बेकार है।

filter और map के साथ

nums = [1, 2, 3, 4, 5, 6]

evens = list(filter(lambda n: n % 2 == 0, nums))     # [2, 4, 6]
squares = list(map(lambda n: n * n, nums))           # [1, 4, 9, 16, 25, 36]

# पर यही चीज़ list comprehension से ज़्यादा साफ़ है
evens = [n for n in nums if n % 2 == 0]
squares = [n * n for n in nums]

साफ़ कह दें: filter/map + lambda पुराना style है। आज list comprehension ज़्यादा पढ़ने लायक और ज़्यादा तेज़ है। नए code में comprehension लिखो।

कब lambda नहीं लिखना चाहिए

# ❌ पढ़ने में मुश्किल, debug करने में और भी
classify = lambda s: "big" if s > 100 else ("mid" if s > 50 else "small")

# ✅ यही साफ़
def classify(s):
    if s > 100:
        return "big"
    if s > 50:
        return "mid"
    return "small"

Common गलतियाँ

  1. return लिख देना — lambda n: return n * n पर SyntaxError। expression अपने आप return होता है।
  2. Lambda को loop में बनाकर closure जाल में फँसना — नीचे देखो, यह सबसे मशहूर bug है।
  3. Statement लिखने की कोशिश — lambda x: x = 5 चलेगा नहीं; assignment statement है, expression नहीं।
  4. ज़रूरत से ज़्यादा lambda — जहाँ built-in function चलेगा (key=len, key=str.lower) वहाँ lambda मत लिखो।
# मशहूर closure जाल — loop के बाद सब lambda एक ही value देखते हैं
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs])          # [2, 2, 2]  — 0 1 2 नहीं!

# fix: value को default argument से बाँध दो
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs])          # [0, 1, 2]

यह इसलिए होता है क्योंकि lambda i को तब पढ़ता है जब वह चलता है, और तब तक loop खत्म होकर i = 2 हो चुका है। i=i उसी वक्त value बाँध देता है।

🛠️ Practice करो (free, browser में)

पढ़ना काफी नहीं — यही bug खुद fix करके देखो। नीचे के problems browser में ही चलते हैं, कोई install नहीं, कोई login नहीं।

सारे free problems देखो →

अक्सर पूछे जाने वाले सवाल

Lambda और def में क्या अंतर है?

Lambda एक expression है जिसका नाम नहीं होता और जिसमें सिर्फ एक expression आ सकता है; def एक पूरा statement है जिसमें कई line, docstring और type hints हो सकते हैं। छोटा एक-line काम जहाँ तुरंत चाहिए — जैसे sorted() के key में — वहाँ lambda; बाकी हर जगह def।

Lambda में return क्यों नहीं लिखते?

क्योंकि lambda का expression अपने आप return हो जाता है। return लिखने पर SyntaxError मिलता है, क्योंकि return एक statement है और lambda में सिर्फ expression की जगह है।

क्या lambda को variable में रख सकते हैं?

तकनीकी रूप से हाँ, पर नहीं रखना चाहिए। अगर function को नाम देना ही है तो def लिखो — traceback में नाम दिखेगा, docstring जोड़ सकोगे, और linter भी शिकायत नहीं करेगा। Lambda तब बनाओ जब उसे तुरंत किसी और function को पास करना हो।

Loop में बनाए lambda एक ही जवाब क्यों देते हैं?

क्योंकि lambda उस variable को तब पढ़ता है जब वह चलता है, और तब तक loop खत्म हो चुका होता है — इसलिए सब आखिरी value देखते हैं। Fix यह है कि value को default argument से बाँध दें: lambda i=i: i. यही closure जाल Python का सबसे मशहूर gotcha है।

आगे पढ़ो