Skip to content
This page has been auto-translated and may contain errors.View in English

बगहाउस

बधाई हो। आप Crooked Orbit के Head of Technology हैं, एक छोटी, थोड़ी अराजक स्पेस लॉजिस्टिक्स कंपनी जो संदिग्ध अंतरिक्ष यात्रियों के एक दल द्वारा चलाई जाती है जिनका कोड और भी अधिक संदिग्ध है।

वेतन ठीक-ठाक है। कोडबेस नहीं...

आपका काम है समस्याओं से निपटना: बग्स, टूटे हुए फ़ंक्शन, वो चीज़ें जो तकनीकी रूप से चलती तो हैं लेकिन वास्तव में नहीं चलनी चाहिए।

#1: नाम फ़ॉर्मैटर

Pip अरे, तो मैंने यह नाम फ़ॉर्मैटर लिखा और यह बस... कुछ नहीं कर रहा? 😭 जैसे यह ठीक चलता है, कोई error नहीं, लेकिन नाम अभी भी सब lowercase में हैं। मैं हर एक पर .capitalize() कॉल कर रही हूँ, मैं इसे लूप में ही देख सकती हूँ। मुझे समझ नहीं आ रहा। क्या आप कृपया देख सकते हैं?
python
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 को बदला ही नहीं।

यहाँ इसे स्पष्ट रूप से देखने का तरीका है:

python
parts = ["आरव", "वान", "डेन", "बर्ग"]

for part in parts:
    part = part.capitalize()

print(parts)
# ['आरव', 'वान', 'डेन', 'बर्ग']  # कुछ नहीं बदला

इसे ठीक करने के लिए, आपको capitalised values के साथ एक नई list बनानी होगी। एक list comprehension इसे साफ़-सुथरे ढंग से करती है:

python
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: टॉप स्कोर

Zee ठीक है तो यह शर्मनाक है लेकिन मेरे पास यह function है जो एक list में highest score खोजने वाला है और यह बस... None print करता है? हर बार। मैं लूप को पाँच बार देख चुकी हूँ, मुझे logic ठीक लगता है। Scores निश्चित रूप से वहाँ हैं। मुझे नहीं पता क्या हो रहा है 😅
python
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 कर रहे हैं।

ठीक करने के लिए अंत में एक लाइन है:

python
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: बजट जाँच

Orla ठीक है तो मैं यह छोटा सा budget tracker बना रही हूँ और यह हर बार जब मैं कोई number डालती हूँ तब crash हो जाता है। जैसे यह उसके साथ कुछ करता भी नहीं है, यह तुरंत TypeError के साथ blow up हो जाता है। मैंने logic check किया और मुझे यह ठीक लगता है? Threshold एक float है, input एक number है... यह किस बात की शिकायत कर रहा है... कृपया मदद करें
python
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() का उपयोग करें:

python
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: कार्गो लेबल

Dex मैं manifest के लिए cargo labels generate कर रहा हूँ और यह इस एक line पर crash होता रहता है। Item name एक string है, weight एक number है, मुझे यह ठीक लगता है? लेकिन Python concatenation के बारे में हंगामा कर रहा है 😩
python
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 करना:

python
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 करती है:

python
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: यात्री मैनिफ़ेस्ट

Cass कुछ बहुत अजीब हो रहा है। मेरे पास यह function है जो प्रत्येक flight के लिए एक passenger list बनाता है, और पहली flight ठीक दिखती है। लेकिन तीसरी तक manifest में पिछली सभी flights के लोग भी हैं? मैं calls के बीच कोई data share नहीं कर रही, हर एक पूरी तरह से अलग है। मुझे सच में नहीं पता क्या हो रहा है 😰
python
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 बनाना:

python
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 का उपयोग करें और इसे अंदर बनाएँ।