1.2.28 · D5 · HinglishIntroduction to Programming (Python)

Question bankDefault parameters, keyword arguments

2,057 words9 min read↑ Read in English

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.

Figure — Default parameters, keyword arguments

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.

Figure — Default parameters, keyword arguments

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.

Figure — Default parameters, keyword arguments

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.

Figure — Default parameters, keyword arguments

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.

Figure — Default parameters, keyword arguments

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?
TRUE — yahi definition hai: ek parameter jise 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.
FALSE — yeh ek baar create hoti hai, jab 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.
FALSE — non-default parameters ko default wale se pehle aana chahiye (defaults drift right, figure s02). Warna ek bare positional argument yeh nahi bata sakta ki woh 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.
TRUE — keyword arguments naam se match hote hain, isliye unka order irrelevant hai; dono 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.
TRUE — saare positional arguments kisi bhi keyword argument se pehle aane chahiye, isliye pehle keyword ke baad Python ek bare positional ko slot se resolve nahi kar sakta.
None as default use karne ka matlab hai ki woh parameter kabhi list hold nahi kar sakta.
FALSE — 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.
FALSE — parameter definition mein naam hota hai; argument call mein supply ki gayi value hoti hai (figure s01). 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.
FALSE — default ka poora point yahi hai ki jo caller 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?
Definition time par 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?
List [] 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?
Bare 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?
Taaki position unambiguous rahe: Python parameters ko left-to-right fill karta hai (figure s02), aur agar default pehle hota, toh ek akela positional yeh nahi bata sakta ki woh us slot ko fill kare ya agle ko skip kare.
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ों?
Woh call ko self-documenting aur order-independent banate hain, isliye 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?
Default expression tab evaluate hota hai jab 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?
Woh common value ko ek jagah bake karte hain (figure s05) instead of har caller ko repeat karne ke liye force karne ke, isliye change ek baar hota hai naa ki dozens of call sites mein — DRY principle - Don't Repeat Yourself ka essence.

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?
Haan — 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?
Haan — har call 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?
Nahi — tuple immutable hai, isliye chahe woh calls mein share ho, koi use mutate nahi kar sakta; shared object kabhi state accumulate nahi kar sakta.
Kya har parameter ka default ho sakta hai?
Haan — 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?
Dono defaults apply hote hain: 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?
Haan, lekin sirf keyword se: 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?
Nahi — defaults scope affect nahi karte; parameter abhi bhi function body ke andar ek local naam hai. Variable scope - local vs global dekho.
Agar default bahar define ki gayi variable reference karta hai — woh value kab capture hoti hai?
Def time par (figure s04). 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?
Haan — 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