1.2.32 · D5 · HinglishIntroduction to Programming (Python)

Question bankLambda functions — anonymous, used with map - filter

1,499 words7 min read↑ Read in English

1.2.32 · D5 · Coding › Introduction to Programming (Python) › Lambda functions — anonymous, used with map - filter


True or false — justify

Recall Reveal the True/False set

Lambda ek alag tarah ka object hai def se bane function se. ::: False — dono exactly usi type ka object banate hain (ek function object); type(lambda x: x) hai <class 'function'>, bilkul def jaisa. Bas ek real difference hai: lambda ka koi meaningful __name__ nahi hota (woh '<lambda>' hota hai). Har lambda ko def ki tarah rewrite kiya ja sakta hai, aur har def ko lambda ki tarah. ::: Sirf aadha sach hai — har lambda ka def equivalent hota hai, lekin ek def jo multiple statements use kare (loops, assignments, kai lines) uska koi lambda equivalent nahi, kyunki lambda ka body sirf ek single expression hota hai. map aur filter ek list return karte hain. ::: False — Python 3 mein ye lazy iterator objects return karte hain. List tab milti hai jab tum inhe list(...) mein wrap karo. Bina wrap kiye kuch aisa dikhega <map object at 0x...>. Lambda mein hamesha kam se kam ek argument hona chahiye. ::: False — lambda: 42 ek valid zero-argument lambda hai jo () se call karne par har baar 42 return karta hai. x = lambda n: n+1 likhna discouraged style hai, chahe kaam kare. ::: True — kaam karta hai, lekin lambda ko naam dena uska purpose khatam karta hai; agar naam de rahe ho, toh def zyada clear hai aur tracebacks mein proper naam deta hai. PEP 8 explicitly yahan def recommend karta hai. filter(None, items) ek syntax error hai kyunki None koi function nahi hai. ::: False — None ko function ki jagah pass karna ek special allowed case hai: filter(None, items) har truthy element ko rakhta hai, bilkul filter(lambda x: x, items) ki tarah. map(...) call karte hi lambda turant run ho jaata hai. ::: False — kyunki map lazy hai, lambda tab tak run nahi hota jab tak tum iterator ko consume nahi karte (via list(), for, next(), etc.). Consume nahi kiya toh lambda kabhi execute nahi hoga.


Spot the error

Recall Reveal the error-spotting set

lambda x: return x*x ::: SyntaxError — lambda body mein sirf ek expression hona chahiye, aur return ek statement hai. Expression khud hi return value hai, isliye bas lambda x: x*x likho. list(filter(lambda x: x*2, nums)) — numbers ko double karna tha. ::: Galat tool — filter select karta hai, transform nahi. x*2 ko truthiness test ki tarah treat kiya jaata hai, toh ye sirf har non-zero number ko unchanged rakhta hai. Double karne ke liye map use karo: list(map(lambda x: x*2, nums)). lambda x: y = x + 1 ::: SyntaxError — assignment (y = ...) ek statement hai, lambda ke andar forbidden hai. Lambda mein ek expression hota hai, code ka block nahi. sorted(pairs, key=lambda a, b: a[1]) — pairs ki list ko second element se sort karna tha. ::: Galat signature — key ek baar mein ek item receive karta hai, isliye lambda mein ek argument hona chahiye: key=lambda p: p[1]. Do parameters call ke time "missing argument" error dega. lambda x: if x > 0: 'pos' else: 'neg' ::: SyntaxErrorif: statement lambda mein nahi reh sakti. Ternary expression use karo: lambda x: 'pos' if x > 0 else 'neg'. result = map(lambda x: x+1, [1,2,3]); print(list(result)); print(list(result)) — dono baar same list expect ki. ::: Doosra print [] dikhayega — map iterator ek full pass ke baad exhausted ho jaata hai. Data reuse karne ke liye pehla list(result) ek variable mein store karo. map(lambda x: print(x), nums) — expect tha ki har number print hoga. ::: Kuch print nahi hoga — map lazy hai aur yahan consume nahi kiya gaya, isliye lambda kabhi run nahi hota. list(map(...)) chahiye hoga ya sirf ek plain for loop (jo side-effects ke liye zyada clear hai).


Why questions

Recall Reveal the "why" set

Lambda ko anonymous kyun kehte hain? ::: Kyunki lambda x: x*x expression ek aisa function object banata hai jiska apna koi bound naam nahi hota — ye ek value ki tarah exist karta hai jise pass karo ya ek baar use karo, bina kisi identifier ke register kiye. map, filter, aur sorted lambda ko argument ki tarah accept kyun kar sakte hain? ::: Kyunki Python mein functions first-class objects hain (dekho First-class functions) — ek function ko store, pass, aur return kiya ja sakta hai bilkul integer ya string ki tarah. Lambda bas aisi hi ek value hai jo inline likhi jaati hai. filter ko ek aisa function kyun chahiye jo True/False return kare, number nahi? ::: Strictly nahi chahiye — ye truthiness check karta hai, toh koi bhi value kaam karti hai; x tab rakha jaata hai jab bool(f(x)) True ho. True/False predicate bas sabse clear aur intentional form hai. List comprehension ko aksar map/filter + lambda se zyada prefer kyun kiya jaata hai? ::: [x*2 for x in nums] jaisi comprehension left-to-right ek line mein padhti hai, list(...) wrapper se bachti hai, aur lambda call overhead se bhi (dekho List comprehensions). map/filter mainly tab shine karte hain jab function pehle se naam se exist karta ho. map aur filter ko lazy design kyun kiya gaya hai, seedha list banane ki jagah? ::: Laziness (dekho Iterators and lazy evaluation) inhe huge ya infinite streams ko ek baar mein ek element process karne deti hai, near-constant memory use karke, aur puri sequence compute kiye bina jaldi rok sakte ho. Lambda mein loop ya multiple statements kyun nahi ho sakte? ::: Design ke hisaab se lambda ek compact expression hai, choti one-off rules ke liye bana hai. Asli multi-step logic ek named def mein honi chahiye jahan readable aur testable ho — ye ek deliberate readability boundary hai, koi technical accident nahi. key=lambda p: p[1] sorted ke ordering ko kyun change karta hai? ::: sorted har item ki key compare karta hai, item khud ko nahi (dekho sorted and key functions); p[1] return karke tum use kehte ho ki second element se compare karo, default tuple ordering jo p[0] se shuru hoti hai usse override karke.


Edge cases

Recall Reveal the edge-case set

list(filter(lambda x: x, [0, '', None, 5, [], 'hi'])) kya return karega? ::: [5, 'hi'] — identity-like lambda ke saath filter sirf truthy values rakhta hai, 0, '', None, aur empty list [] drop ho jaate hain. list(map(lambda x: x, [])) kya return karega? ::: [] — empty iterable par map karna simply kuch yield nahi karta; lambda kabhi call nahi hota. map/filter empty inputs ko gracefully handle karte hain. (lambda: 7)() ka result kya hai? ::: 7 — ek zero-argument lambda ko empty parentheses se call karne par uska constant expression return hota hai. Baad ke () hi asal mein use invoke karte hain. Agar do lambdas ke bodies identical hain, toh kya wo same object hain? ::: Nahi — (lambda x: x) is (lambda x: x) False hai. Har lambda expression ek naya, alag function object banata hai, chahe code text match kare. list(map(lambda x, y: x + y, [1,2,3], [10,20,30])) se kya hoga? ::: [11, 22, 33]map multiple iterables le sakta hai aur multi-argument lambda mein har ek se ek element parallel mein feed karta hai. Lengths alag hoon toh sabse chote iterable par ruk jaata hai. [lambda: i for i in range(3)] mein, baad mein call karne par teeno lambdas kya return karengi? ::: Sab 2 return karengi — lambdas variable i ko capture karti hain (late binding), creation time ki value ko nahi; jab tak ye run hoti hain, loop i ko uski final value 2 par chhod chuka hota hai. Ye classic closure trap hai. sorted([3, None, 1], key=lambda x: x) kaam karega? ::: Nahi — ye TypeError raise karta hai kyunki None ko int se compare karna supported nahi hai. Key function akele aise values ko nahi bacha sakti jo fundamentally uncomparable hain; pehle inhe kisi comparable proxy par map karna hoga.