Question bank — Default parameters, keyword arguments
1.2.28 · D5· Coding › Introduction to Programming (Python) › Default parameters, keyword arguments
Warm-up pictures (pehle mental model banao)
Traps se pehle, teen drawings jo tum baar baar refer karte rahoge.
1 — Parameters vs arguments ek binding map ki tarah. Parameter ek khali labelled box hai function ke andar; argument woh value hai jo call karne par us box mein dali jaati hai. Arrows dekho: left side ki call values right side ke parameter boxes mein flow karti hain, aur box names woh labels hain jinhein tum keyword se address kar sakte ho.

2 — "Defaults drift right" kyun hota hai. Phrase defaults drift right ka matlab sirf yeh hai: ek definition mein, har woh parameter jiske paas default NAHI hai, use kisi bhi aise parameter se pehle aana chahiye jiske paas default ho. Figure dikhata hai kyun. Python boxes ko strictly left to right by position fill karta hai. Agar ek default box left par hota aur required box right par, toh ek akela positional value ke paas koi rule nahi hota yeh batane ke liye ki woh kis box mein jaaye — ✗ layout ambiguous hai, isliye Python use bilkul forbid karta hai.

3 — The one-object-shared trap. def add(item, bag=[]) ke liye, list [] EK BAAR banti hai, jab def line run hoti hai — har call par nahi. Red list object wahi same object hai jise har call reach karti hai, isliye appends usmein pile up hote jaate hain. Figure arrows trace karta hai: teen calls, ek shared red list.

4 — Evaluation timing: def-time vs call-time. Timeline dikhati hai ki default expression ★ marked "def runs" par evaluate hoti hai — kisi bhi call se kaafi pehle. Us ★ ke baad kisi bahar ki variable ko reassign karna us cheez ko nahi badal sakta jo already default mein freeze ho chuki hai.

5 — Defaults aur DRY, concretely. Default ke bina, chaar call sites sab 5432, "utf8", 30 repeat karte hain; port ek baar badlo aur tumhe har copy dhundni padegi. Value ko definition mein bake karne ka matlab hai edit karne ki ek jagah. Figure donon worlds ko contrast karta hai — red single source of truth vs scattered duplicates.

Is general rule ke liye DRY principle - Don't Repeat Yourself dekho jo yeh illustrate karta hai.
True or false — justify karo
Ek default parameter woh hota hai jiske paas ek fallback value hoti hai jaise def f(x=10). True ya false?
def mein ek fallback diya gaya ho, use tabhi use kiya jaata hai jab caller use omit kare. Neeche sab kuch isi par build hota hai.Ek parameter ki default value har baar function call hone par fresh create hoti hai.
def line run hoti hai (figure s03/s04 dekho). Wahi single object har call par reuse hota hai, aur yahi mutable-default trap ka cause hai.Ek definition mein, tum def f(a=1, b) likh sakte ho.
a fill kar raha hai ya b.box(height=5, width=2) aur box(width=2, height=5) same function ko identically call karte hain.
width=2, height=5 bind karte hain.Jaise hi ek call mein ek keyword argument use karte ho, uske baad har argument bhi keyword hona chahiye.
None as default use karne ka matlab hai ki woh parameter kabhi list hold nahi kar sakta.
None sirf ek sentinel hai jo kehta hai "kuch pass nahi kiya gaya"; function ke andar tum use ek real list se replace karte ho (if bag is None: bag = []), aur callers apni list pass kar sakte hain.Parameter aur argument ek hi cheez ke do naam hain.
def f(x) mein parameter x hai; f(5) mein argument 5 hai.def connect(host, port=5432) har caller ko 5432 type karne ke liye majboor karta hai.
5432 chahta hai woh kuch type nahi karta; sirf unusual caller use override karta hai.Error dhundho
Har line broken ya surprising hai. Exact fault batao.
def f(x=1, y): ... — kya toot ta hai aur kab?
SyntaxError: ek non-default parameter y, default x ke baad aata hai (figure s02 ka ✗ layout). Python def ko kabhi run hone se pehle hi reject kar deta hai.greet("Asha", name="Asha") jahan def greet(name, greeting="Hello") ho — kya hoga?
TypeError: got multiple values for argument 'name' — positional "Asha" ne name fill kar diya, aur keyword use phir se fill karne ki koshish karta hai.Call mein f(a=1, 2) — yeh illegal kyun hai?
SyntaxError / positional-after-keyword: jaise hi a=1 keyword hai, bare 2 ke paas koi slot nahi hai jise Python safely assign kar sake. Positionals pehle aane chahiye.def add(item, bag=[]): bag.append(item); return bag — hidden bug kya hai?
[] def time par ek baar create hoti hai (figure s03), isliye default share karne wali har call same list mein accumulate karti hai: add(1)→[1], phir add(2)→[1,2].def collect(x, seen=None): if seen == []: seen = []; ... — == [] test galat kyun hai?
== [] ek real empty list se bhi match karta hai jo caller legitimately pass kar sakta hai, isliye tum silently unka object throw away kar doge. is None use karo, jo poochha hai "kya kuch pass nahi kiya gaya?".power(5, mod=7, 2) jahan def power(base, exp=2, mod=None) ho — kya fail hoga?
2 keyword mod=7 ke baad aata hai, positional-before-keyword violate karta hai; yeh logic bug nahi, syntax error hai.def f(a, b, /, c, *, d): ... phir f(1, 2, 3, 4) — call fail kyun hoti hai?
d keyword-only hai (* ke baad), isliye yeh d=4 hona chahiye; bare 4 use fill nahi kar sakta. TypeError: too many positional arguments.Why questions
Sirf rule nahi, reason explain karo.
Definitions mein defaults non-defaults ke baad kyun aane chahiye?
Call mein positionals keywords se pehle kyun aane chahiye?
d=9 jaise keyword ke baad, Python slots position se count karna band kar deta hai, isliye baad mein ek bare value ke paas land karne ki jagah nahi hoti — resolution rule toot jaata.Keyword arguments kyun matter karte hain jab function mein kaafi parameters hों?
box(width=2, height=5) clearly read hota hai instead of box(2,5,0,1) jaise mystery ke.Mutable-default bug exist hi kyun karta hai — default per call evaluate kyun nahi hota?
def execute hota hai function object build karne ke liye (figure s04); per call re-evaluate karna ek alag, zyada expensive design hota. Immutable defaults sharing hide karte hain; mutable wale expose karte hain. Mutable vs immutable objects dekho.None standard sentinel kyun hai instead of, maan lo, [] ya 0?
None ek unique singleton hai jiske barabar koi meaningful data usually nahi hota, isliye is None "omitted" aur "genuinely passed an empty/zero value" ko cleanly distinguish karta hai.Defaults DRY principle se kyun connected hain?
Edge cases
Boundary aur degenerate scenarios — har corner cover karo.
Kya caller ek bag=None function mein empty list pass kar sakta hai aur use use kiya ja sakta hai?
collect(1, seen=[]) ek real empty list pass karta hai; kyunki woh None nahi hai, function us list mein append karta hai aur use return karta hai, caller ke object ko respect karte hue.Agar add(item, bag=None) ke do calls dono bag omit karein — kya unki lists independent hain?
bag is None hit karti hai aur ek fresh [] banati hai, isliye lists alag hain. Yahi exactly shared-mutable trap ka fix hai.Kya def f(x=()) jaisa tuple default [] ki tarah dangerous hai?
Kya har parameter ka default ho sakta hai?
def f(a=1, b=2) legal hai, aur f() use sab defaults ke saath call karta hai. Rule 1 tab hi violate hota hai jab ek non-default, default ke baad aaye.power(5) call karne par kya hoga jahan def power(base, exp=2, mod=None) ho?
exp=2, mod=None, jo 5**2 = 25 deta hai bina kisi modulo ke — woh chota common-case call jiske liye defaults design kiye gaye the.Kya tum ek baad mein parameter set kar sakte ho jabki pehle wala apne default par rahe?
power(5, mod=7) exp skip karta hai (2 rehta hai). Positionally yeh impossible hai — tum ek hole nahi chhod sakte — aur yahi precisely woh reason hai ki keyword arguments exist karte hain.Default dene se kya parameter function ke liye local rehna band ho jaata hai?
Agar default bahar define ki gayi variable reference karta hai — woh value kab capture hoti hai?
x=5; def f(a=x): ... a ke default ko 5 par freeze kar deta hai; baad mein x reassign karna default nahi badlata, kyunki expression already evaluate ho chuka tha.def f(a, b, /): mein / defaults aur keywords ko kya karta hai?
/ se pehle sab kuch positional-only hai: tum un parameters ko defaults de sakte ho, lekin callers unhe kabhi naam se pass NAHI kar sakte. f(a=1) TypeError raise karta hai.def f(*, key, mode="x"): mein leading * kya force karta hai?
* ke baad sab kuch keyword-only hai: key aur mode sirf naam se pass kiye ja sakte hain (f(key=1)), kabhi positionally nahi — chahe key ke paas koi default nahi hai, use naam se hi pass karna hoga.Kya ek keyword-only parameter default carry kar sakta hai?
def f(*, mode="x") mode ko default bhi deta hai AUR keyword-only bhi banata hai. Omit karo toh default apply hota hai; sirf mode=... ke form mein supply karo.Connections
- Functions - def and return
- Variable scope - local vs global
- *args and **kwargs (variadic functions)
- Mutable vs immutable objects
- DRY principle - Don't Repeat Yourself