1.2.28 · D2 · HinglishIntroduction to Programming (Python)

Visual walkthroughDefault parameters, keyword arguments

1,961 words9 min read↑ Read in English

1.2.28 · D2 · Coding › Introduction to Programming (Python) › Default parameters, keyword arguments


Step 1 — Ek function khaali boxes ki ek row hai

KYA HAI. Jab aap def greet(name, greeting): likhte ho, Python do labelled boxes reserve karta hai — ek name naam ka, ek greeting naam ka. Yeh names parameters hain: definition mein boxes ke upar ke labels.

YAH SE KYU SHURU KARO. Baad ke har rule ("defaults right mein jaate hain", "positionals pehle aate hain") asliyat mein ek rule hai ki boxes kaise fill hote hain. Agar aap boxes picture karo, toh rules arbitrary lagte hi band ho jaate hain.

PICTURE. Do khaali boxes wait kar rahe hain. Unme abhi kuch nahi hai — ek bare definition kuch fill nahi karta.

Figure — Default parameters, keyword arguments

Step 2 — Positional filling: values left to right girti hain

KYA HAI. greet("Asha", "Hi") call karo. Python arguments ko boxes mein order mein daalta hai: pehli value pehle box mein, doosri doosre mein.

Code ke neeche har label kehta hai ki woh value kis box mein jaati hai. Position — aur kuch nahi — decide karta hai.

KYU. Yahi woh default behaviour hai jo Python pehle try karta hai. Yeh fast hai aur kisi naam ki zaroorat nahi, lekin iska ek weakness hai jo hum Step 4 mein expose karenge.

PICTURE. Do arrows, pehli value box 1 mein, doosri box 2 mein, strictly order ke hisaab se.

Figure — Default parameters, keyword arguments

Step 3 — Ek default ek value hai jo box ke andar pre-printed hai

KYA HAI. Ab def greet(name, greeting="Hello"): likho. Doosra box "Hello" ke saath already printed inside aata hai. Yeh printed value default hai.

  • name= ke left ka term box ka label hai.
  • "Hello"= ke right ki value woh hai jo box mein baith jaati hai agar caller kuch nahi daale.

KYU. Yahi defaults ka pura point hai (DRY idea): common value ek jagah rehti hai. Jo callers "Hello" se khush hain woh kuch nahi bolte; sirf unusual caller hi isse overwrite karta hai.

PICTURE. Box 1 khaali aur required; box 2 mein pehle se ek faint "Hello" dikh raha hai jis par ek real argument paint kar sakta hai.

Figure — Default parameters, keyword arguments

Step 4 — Position akela kyun fail hota hai, aur keywords kaise bachate hain

KYA HAI. Ek function ko teen boxes do: def box(width, height, x=0, y=0):. Call box(2, 5, 0, 1) padho. Kaun sa number kaunsa hai? Position aapko ek invisible order yaad rakhne par majboor karta hai.

Ek keyword argument yeh fix karta hai: aap box ka naam bol ke dete ho — x=0 matlab "0 ko x label wale box mein daalo, chahe woh kahaan bhi ho."

Kyunki har value apna label carry karti hai, order ka koi matlab nahi rehta: box(height=5, width=2) exact same boxes fill karta hai.

YEH TOOL KYU AUR KOI KYU NAHI. Position compact hai lekin fragile — ek value slip ho gayi toh har baad ki value silently galat box mein chali jaayegi. Naming kuch keystrokes trade karta hai aisi calls ke liye jo self-documenting aur order-independent hoti hain. Yahi keyword arguments ka poora justification hai.

PICTURE. Left: chaar bare numbers, boxes ke upar question marks. Right: wahi call names ke saath likhi, har arrow apne named box par certainty ke saath land karti.

Figure — Default parameters, keyword arguments

Step 5 — Skip trick: paas waale boxes ko touch kiye bina door waale box tak pahunchna

KYA HAI. def power(base, exp=2, mod=None): ke saath, maano aap mod set karna chahte ho lekin exp ko uske default 2 par rehne dena chahte ho. Positionally impossible hai — 3rd box tak position se pahunchne ke liye pehle 2nd mein kuch daalna padega. Keyword bachao:

  • 5 — positional, base mein land karta hai.
  • mod=7 — named, exp ke upar se koodta hai, isliye exp apna printed default 2 rakhta hai.

Result: , phir .

KYU. Yahi defaults + keywords ka roz ka faayda hai: sirf woh ek knob badlo jo aapko chahiye aur baaki har box ko apni factory value rakhne do.

PICTURE. Teen boxes; base par ek arrow, ek curved arrow exp ke upar se koodke mod par land karti hai, exp abhi bhi apna default 2 glow kar raha hai.

Figure — Default parameters, keyword arguments

Step 6 — Do iron rules, box logic mein dekhe gaye

KYA HAI. Do rules, dono obvious hain jab aap boxes dekhte ho.

Rule 1 KYU. Python position se left to right fill karta hai. Agar ek pre-filled box kisi empty required box se pehle hota, toh ek single positional value ambiguous ho jaati — kya woh default ko overwrite kar rahi hai, ya uske peechhe wale required box ke liye hai? Us ordering ko ban karne se ambiguity khatam ho jaati hai.

Rule 2 KYU. Jis moment aap c=9 likhte ho, Python positions count karna band kar deta hai. Baad ka bare 2 ab kisi known slot mein fit nahi hota. Isliye har position-based value pehle resolve honi chahiye.

PICTURE. Top row: ek legal definition (khaale boxes phir pre-filled boxes) green check ke saath; ek tooti hui definition red cross ke saath jahan ek bare value nahi bata sakti ki woh kis box ki hai.

Figure — Default parameters, keyword arguments

Step 7 — Degenerate case: jab default ek mutable box-filler ho

KYA HAI. Yeh subtle wala hai. Default box mein jo value print hoti hai woh ek baar create hoti hai, us waqt jab def line run hoti hai — har call par fresh nahi. Agar woh value ek list hai (ek mutable object, jise aap in place change kar sakte ho), toh har woh call jo argument omit karta hai woh same list share karta hai.

def add(item, bag=[]):   # yeh [] ONCE bana hai, def time pe
    bag.append(item)
    return bag
add(1)   # [1]
add(2)   # [1, 2]   <- same list, abhi bhi purana item hold kar raha hai!

YEH KYU HOTA HAI. Printed default ek single object hai. append us ek object ko mutate karta hai, isliye "leftovers" agli call mein bhi rehte hain. Yahi wajah hai ki yeh concept sirf mutable defaults ke saath problem karta hai — ek number ya string in place mutate nahi ho sakta, isliye woh kabhi leak nahi hota.

PICTURE. Ek list object definition ke time ek baar draw kiya gaya; teen alag calls sab ek hi same box par arrows point kar rahi hain, har append pichle ke upar pile on karta hua.

Figure — Default parameters, keyword arguments

Ek picture summary

Upar ka sab kuch ek flow mein collapse hota hai: arguments aate hain, boxes position se fill hote hain, phir name se, defaults gaps cover karte hain — aur beware the shared mutable box.

Figure — Default parameters, keyword arguments
Recall Feynman: puri walkthrough seedhi zabaan mein batao

Ek function labelled boxes ki ek row hai. Jab aap use call karte ho, aapki values boxes mein left to right girti hain — yeh hai positional. Kuch boxes mein pehle se ek value print hoti hai (ek default), isliye agar aap wahan kuch nahi daalte, toh printed value wahi rehti hai. Jab bohot saare boxes ho, order yaad rakhna risky hai, isliye aap har value ka box naam bol ke de sakte ho — keyword arguments — aur ab order ka koi matlab nahi rehta, aur aap ek paas waale box ko skip karke door waale ko fill kar sakte ho jabke paas wala apni factory setting par rehta hai. Do rules isse unambiguous rakhte hain: definition mein, khaale required boxes pre-filled ones se pehle jaate hain; call mein, saare order-based values kisi bhi named ones se pehle aate hain. Aur ek trap: printed default ek baar stamp hota hai, isliye agar woh ek list hai jisme aap keep adding karte ho, toh sablog same list share karte hain — ise fix karo None print karke aur andar ek fresh list banake.


Active recall

Jab aap bina names ke call karo toh arguments kahan land karte hain?
Boxes mein left to right, position se.
def line mein greeting="Hello" kya karta hai?
Us box ko "Hello" se pre-fill karta hai jab tak caller ise overwrite na kare.
Ek door waale box ko set karte hue paas waale default ko kaise rakhte ho?
Door waale box ko name karo, jaise power(5, mod=7) — keyword exp ke upar se kood jaata hai.
Call mein positional arguments keyword ones se pehle kyun aane chahiye?
Jab ek naam use ho jaata hai, Python positions count karna band kar deta hai, isliye baad ka bare value kisi known slot mein fit nahi hota.
Default value kab create hoti hai?
Ek baar, definition time par — har call par nahi.
Mutable-default bug sirf lists/dicts ko kyun lagta hai?
Woh mutable hain — ek single shared object in place change hota hai; numbers aur strings nahi ho sakte.

Connections