बगहाउस
बधाई हो। आप Crooked Orbit के Head of Technology हैं, एक छोटी, थोड़ी अराजक स्पेस लॉजिस्टिक्स कंपनी जो संदिग्ध अंतरिक्ष यात्रियों के एक दल द्वारा चलाई जाती है जिनका कोड और भी अधिक संदिग्ध है।
वेतन ठीक-ठाक है। कोडबेस नहीं...
आपका काम है समस्याओं से निपटना: बग्स, टूटे हुए फ़ंक्शन, वो चीज़ें जो तकनीकी रूप से चलती तो हैं लेकिन वास्तव में नहीं चलनी चाहिए।
#1: नाम फ़ॉर्मैटर
.capitalize() कॉल कर रही हूँ, मैं इसे लूप में ही देख सकती हूँ। मुझे समझ नहीं आ रहा। क्या आप कृपया देख सकते हैं? def format_name(full_name):
parts = full_name.split()
for part in parts:
part = part.capitalize()
return " ".join(parts)
print(format_name("आरव वान डेन बर्ग"))अपेक्षित: आरव वान डेन बर्ग
मिला: आरव वान डेन बर्ग
क्या गलत हो रहा है, और आप इसे कैसे ठीक करेंगे?
संकेत
सोचिए कि जब आप for लूप के अंदर एक variable को reassign करते हैं तो वास्तव में क्या होता है। क्या part को बदलने से वह list प्रभावित होती है जिससे वह आया था?
इसे ठीक करने का एक तरीका
जब आप for part in parts लिखते हैं, तो Python आपको list का प्रत्येक item एक-एक करके देता है। part बस एक अस्थायी variable है जो वर्तमान item को रखता है। यह list से सीधा कनेक्शन नहीं है।
तो जब आप part = part.capitalize() लिखते हैं, आप उसे बदल रहे हैं जिस ओर part इशारा करता है। लेकिन parts अभी भी मूल strings को रखता है। आपने कभी भी वास्तव में list को बदला ही नहीं।
यहाँ इसे स्पष्ट रूप से देखने का तरीका है:
parts = ["आरव", "वान", "डेन", "बर्ग"]
for part in parts:
part = part.capitalize()
print(parts)
# ['आरव', 'वान', 'डेन', 'बर्ग'] # कुछ नहीं बदलाइसे ठीक करने के लिए, आपको capitalised values के साथ एक नई list बनानी होगी। एक list comprehension इसे साफ़-सुथरे ढंग से करती है:
def format_name(full_name):
parts = full_name.split()
return " ".join(part.capitalize() for part in parts)
print(format_name("आरव वान डेन बर्ग"))
# आरव वान डेन बर्गpart.capitalize() for part in parts प्रत्येक नाम से गुज़रता है, उसे capitalise करता है, और परिणामों को एक नई list में इकट्ठा करता है। फिर .join() उन्हें spaces के साथ वापस जोड़ देता है।
#2: टॉप स्कोर
None print करता है? हर बार। मैं लूप को पाँच बार देख चुकी हूँ, मुझे logic ठीक लगता है। Scores निश्चित रूप से वहाँ हैं। मुझे नहीं पता क्या हो रहा है 😅 def highest_score(scores):
best = 0
for score in scores:
if score > best:
best = score
results = [45, 92, 78, 88, 65]
print(f"Top score: {highest_score(results)}")अपेक्षित: Top score: 92
मिला: Top score: None
क्या गलत हो रहा है, और आप इसे कैसे ठीक करेंगे?
संकेत
यदि आप कभी return statement नहीं लिखते तो एक function क्या return करता है?
इसे ठीक करने का एक तरीका
लूप ठीक है। Logic ठीक है। समस्या यह है कि highest_score वास्तव में कभी कुछ वापस नहीं देता। यह सबसे अच्छा score ढूँढता है और फिर उसके साथ कुछ नहीं करता।
Python में, यदि एक function में return statement नहीं है, तो वह स्वचालित रूप से None return करता है। आप वही print कर रहे हैं।
ठीक करने के लिए अंत में एक लाइन है:
def highest_score(scores):
best = 0
for score in scores:
if score > best:
best = score
return best
results = [45, 92, 78, 88, 65]
print(f"Top score: {highest_score(results)}")
# Top score: 92यह अक्सर सामने आता है। Function पूरा दिखता है क्योंकि logic सब वहाँ है, लेकिन return के बिना, function समाप्त होते ही परिणाम बस गायब हो जाता है।
#3: बजट जाँच
def check_budget(threshold):
spent = input("How much have you spent? ")
if spent >= threshold:
print("Over budget!")
else:
print("You're within budget.")
check_budget(500.0)Error:
TypeError: '>=' not supported between instances of 'str' and 'float'क्या गलत हो रहा है, और आप इसे कैसे ठीक करेंगे?
संकेत
input() हमेशा कौन सा type return करता है, चाहे user कुछ भी type करे?
इसे ठीक करने का एक तरीका
input() हमेशा एक string return करता है। इससे कोई फ़र्क नहीं पड़ता कि user ने एक number type किया। Python को यह नहीं पता। यह बस जो भी type किया गया था उसे text के रूप में वापस दे देता है।
तो जब code spent >= threshold की तुलना करने की कोशिश करता है, यह एक string की एक float से तुलना कर रहा है, और Python ऐसा करने से इंकार करता है। वही TypeError है।
ठीक करने का तरीका है input को compare करने से पहले number में convert करना। दशमलव values को handle करने के लिए float() का उपयोग करें:
def check_budget(threshold):
spent = float(input("How much have you spent? "))
if spent >= threshold:
print("Over budget!")
else:
print("You're within budget.")
check_budget(500.0)
# How much have you spent? 620
# Over budget!input() को float() में लपेटना तुरंत string को number में convert कर देता है, इसलिए तुलना अपेक्षा के अनुसार काम करती है।
यह Python में भ्रम के सबसे आम स्रोतों में से एक है: input() ऐसा लगता है कि यह एक number पढ़ रहा है, लेकिन यह हमेशा आपको एक string देता है। आपको इसे स्वयं convert करना होगा।
#4: कार्गो लेबल
def cargo_label(item, weight):
label = "Item: " + item + " | Weight: " + weight + "kg"
return label
print(cargo_label("Moon rocks", 42))Error:
TypeError: can only concatenate str (not "int") to strक्या गलत हो रहा है, और आप इसे कैसे ठीक करेंगे?
संकेत
Python का + operator स्वचालित रूप से numbers को strings में convert नहीं करता। उन्हें जोड़ने से पहले आपको क्या करना होगा?
इसे ठीक करने का एक तरीका
जब आप Python में strings को जोड़ने के लिए + का उपयोग करते हैं, तो हर value एक string होनी चाहिए। weight एक integer है, इसलिए Python को नहीं पता कि इसे आसपास के text से कैसे जोड़ा जाए। यह अनुमान लगाने के बजाय इंकार कर देता है।
ठीक करने का तरीका है str() के साथ weight को string में convert करना:
def cargo_label(item, weight):
label = "Item: " + item + " | Weight: " + str(weight) + "kg"
return label
print(cargo_label("Moon rocks", 42))
# Item: Moon rocks | Weight: 42kgइस तरह की चीज़ के लिए एक f-string अक्सर अधिक साफ़-सुथरी होती है, क्योंकि यह आपके लिए conversion को handle करती है:
def cargo_label(item, weight):
return f"Item: {item} | Weight: {weight}kg"
print(cargo_label("Moon rocks", 42))
# Item: Moon rocks | Weight: 42kg{} के अंदर, Python स्वचालित रूप से value को उसके string representation में convert कर देता है, इसलिए आपको str() की बिल्कुल भी ज़रूरत नहीं है।
#5: यात्री मैनिफ़ेस्ट
def build_manifest(name, passengers=[]):
passengers.append(name)
return passengers
flight_1 = build_manifest("आरव")
flight_2 = build_manifest("प्रिया")
flight_3 = build_manifest("रोहन")
print(flight_1)
print(flight_2)
print(flight_3)अपेक्षित:
['आरव']
['प्रिया']
['रोहन']मिला:
['आरव']
['आरव', 'प्रिया']
['आरव', 'प्रिया', 'रोहन']क्या गलत हो रहा है, और आप इसे कैसे ठीक करेंगे?
संकेत
Python में default argument values का मूल्यांकन एक बार किया जाता है, जब function define होता है। हर बार function call होने पर नहीं। एक list जैसे mutable object के लिए इसका क्या मतलब है?
इसे ठीक करने का एक तरीका
यह Python के सबसे प्रसिद्ध आश्चर्यों में से एक है। जब आप default argument के रूप में passengers=[] लिखते हैं, तो Python उस list को function define होने पर एक बार बनाता है। हर call जो default का उपयोग करता है, ठीक उसी list object को share कर रहा है। तो एक call में इसमें append करना हर भविष्य की call को प्रभावित करता है।
मानक समाधान है None को default के रूप में उपयोग करना और function के अंदर एक नई list बनाना:
def build_manifest(name, passengers=None):
if passengers is None:
passengers = []
passengers.append(name)
return passengers
flight_1 = build_manifest("आरव")
flight_2 = build_manifest("प्रिया")
flight_3 = build_manifest("रोहन")
print(flight_1) # ['आरव']
print(flight_2) # ['प्रिया']
print(flight_3) # ['रोहन']अब हर call जो list pass नहीं करती, उसे अपनी एकदम नई list मिलती है।
यह किसी भी mutable default पर लागू होता है: lists, dicts, sets। यदि आप हर बार एक नया चाहते हैं, तो इसे signature में न डालें। None का उपयोग करें और इसे अंदर बनाएँ।

