स्ट्रिंग के साथ काम — इंडेक्सिंग, स्लाइसिंग और f-strings
स्ट्रिंग से टुकड़े निकालना, उसे साफ़ करना, बदलना और f-string से आसानी से पढ़े जाने वाले मैसेज बनाना — साथ में यह नियम कि स्ट्रिंग को उसी जगह बदला नहीं जा सकता।
आप कैसे सीखना चाहते हैं?
वह समस्या जिसे हम हल कर रहे हैं
एक फ़ॉर्म से नाम आया है: " Rafi Ahmed "। शुरू और आख़िर में फ़ालतू स्पेस हैं, जबकि आपको सिर्फ़ पहला नाम चाहिए, और एक मैसेज — "Welcome, Rafi!"।
यह काम — स्ट्रिंग को साफ़ करना, उसमें से हिस्से निकालना, और उनसे नया मैसेज बनाना — प्रोग्रामिंग में सबसे ज़्यादा किए जाने वाले कामों में से एक है। यूज़रनेम, ईमेल, आईडी, फ़ाइल के नाम, पते, API से आया जवाब — सब स्ट्रिंग ही हैं।
और आज एक बात साफ़ होगी, जो न पता हो तो घंटों बर्बाद होते हैं: पायथन में स्ट्रिंग बदली नहीं जा सकती। name.upper() लिखने से name बड़े अक्षरों में नहीं बदल जाता। ऐसा क्यों नहीं होता, और फिर क्या करना होता है — यही इस अध्याय का सबसे क़ीमती हिस्सा है।
इस अध्याय के बाद आप यह कर पाएँगे
- इंडेक्स से स्ट्रिंग का कोई भी अक्षर निकालना, आगे से भी और पीछे से भी
- स्लाइस से एक हिस्सा काटकर निकालना
strip,upper,lower,replaceऔरsplitसे स्ट्रिंग को साफ़ करना और बदलना- समझना कि मेथड का नतीजा सँभालकर रखना क्यों ज़रूरी है
- f-string से आसानी से पढ़े जाने वाले मैसेज बनाना
पहले यह आना चाहिए: अंकगणित — भाग, शेषफल और दशमलव का जाल।
कोटेशन — एक या दो
पायथन के लिए 'Rafi' और "Rafi" एक ही चीज़ हैं। दोनों तरह के कोटेशन इसलिए हैं ताकि स्ट्रिंग के अंदर कोटेशन हो तो दिक़्क़त न आए:
print("It's working")
print('She said "yes"')It's working
She said "yes"तीन कोटेशन लगाने पर कई लाइनों वाली स्ट्रिंग रखी जा सकती है:
note = """Dear customer,
Your order is confirmed.
Thank you."""
print(note)Dear customer,
Your order is confirmed.
Thank you.और \n लिखने से नई लाइन बनती है, \t से टैब:
print("Name:\tRafi\nRole:\tLearner")Name: Rafi
Role: Learnerलंबाई और इंडेक्स
word = "PYTHON"
print(len(word))
print(word[0])
print(word[1])
print(word[-1])
print(word[-2])6
P
Y
N
Oदो बातें दिमाग़ में बिठा लीजिए:
गिनती शून्य से शुरू होती है। पहले अक्षर का इंडेक्स 0 है, दूसरे का 1। इसलिए छह अक्षरों वाले शब्द में आख़िरी अक्षर का इंडेक्स 5 है, 6 नहीं। word[6] लिखेंगे तो IndexError आएगा। यह "एक ज़्यादा" वाली ग़लती इतनी आम है कि अंग्रेज़ी में इसका अलग नाम ही है — off-by-one error।
नेगेटिव इंडेक्स पीछे से गिनता है। word[-1] आख़िरी अक्षर है, word[-2] उससे पहले वाला। शब्द कितना लंबा है यह जाने बिना आख़िरी अक्षर पाने का यही आसान तरीक़ा है।
स्लाइस — एक हिस्सा काटकर निकालना
word = "PROGRAMMING"
print(word[0:7])
print(word[7:11])
print(word[:7])
print(word[7:])
print(word[-4:])PROGRAM
MING
PROGRAM
MING
MINGword[a:b] का मतलब है a से शुरू करके b से पहले तक। आख़िरी नंबर शामिल नहीं होता।
शुरू में यह अटपटा लगता है, लेकिन इसका एक फ़ायदा है: word[0:7] और word[7:11] — दोनों टुकड़े बिल्कुल ठीक जुड़ जाते हैं, कोई अक्षर दो बार नहीं आता और कोई छूटता भी नहीं। शुरू का नंबर न दें तो मतलब "बिल्कुल शुरू से", और आख़िरी नंबर न दें तो मतलब "बिल्कुल आख़िर तक"।
स्ट्रिंग बदली नहीं जा सकती
यही इस अध्याय का सबसे ज़रूरी नियम है:
name = "rafi"
name[0] = "R"Traceback (most recent call last):
File "D:\python-lab\lesson-06\demo.py", line 2, in <module>
name[0] = "R"
~~~~^^^
TypeError: 'str' object does not support item assignmentपहली File लाइन में आपकी फ़ाइल का पूरा पाथ होता है, इसलिए आपके कंप्यूटर पर यह अलग दिखेगा। असली बात आख़िरी लाइन में है: एक बार बन चुकी स्ट्रिंग के अंदर का अक्षर बदला नहीं जा सकता। तो फिर बड़े अक्षर करना, स्पेस काटना — यह सब कैसे होता है? जवाब: पायथन पुरानी स्ट्रिंग नहीं बदलता, एक नई स्ट्रिंग बनाकर लौटा देता है।
name = " rafi "
print(name.strip())
print(name.strip().upper())
print("After all that, name is still:", name)rafi
RAFI
After all that, name is still: rafiname ज़रा भी नहीं बदला। strip() ने एक नई साफ़ स्ट्रिंग बना दी, और हमने उसे सिर्फ़ प्रिंट किया — कहीं स्टोर नहीं किया।
इसलिए नतीजे को सँभालकर रखना पड़ता है:
name = " rafi "
clean_name = name.strip().upper()
print(clean_name)RAFIया उसी नाम में दोबारा रख दीजिए — name = name.strip()। मेथड चलाकर नतीजा न रखना — यह एक ग़लती शुरुआत में हर किसी से होती है। और कोई एरर नहीं आता, इसलिए पकड़ने में भी समय लगता है।
काम के मेथड
raw = " Rafi Ahmed "
print(raw.strip())
print(raw.strip().lower())
print(raw.strip().upper())
print(raw.strip().replace(" ", "_"))
print(len(raw), len(raw.strip()))
print("rafi" in raw.lower())Rafi Ahmed
rafi ahmed
RAFI AHMED
Rafi_Ahmed
14 10
Truestrip()— शुरू और आख़िर की ख़ाली जगह काटता है (बीच वाली नहीं)lower()/upper()— छोटे या बड़े अक्षरों में बदलता हैreplace(a, b)— हरaकी जगहbरख देता हैin— बताता है कि एक स्ट्रिंग दूसरी के अंदर है या नहीं
और split() स्ट्रिंग को टुकड़ों में तोड़ता है:
full_name = "Rafi Ahmed Khan"
parts = full_name.split(" ")
print(parts)
print(parts[0])
print(len(parts))['Rafi', 'Ahmed', 'Khan']
Rafi
3स्क्वेयर ब्रैकेट वाली इस चीज़ को लिस्ट कहते हैं — उस पर आगे एक अलग अध्याय है। अभी बस इतना जान लीजिए कि split() टुकड़े इसी तरह लौटाता है, और इंडेक्स से कोई एक टुकड़ा निकाला जा सकता है।
तुलना करने से पहले साफ़ कर लीजिए। यूज़र"Rafi "लिखे तो वह"rafi"के बराबर नहीं है — आख़िर का एक फ़ालतू स्पेस और एक बड़ा अक्षर, कुल दो फ़र्क़। इसलिए तुलना से पहले.strip().lower()चलाना लगभग हर प्रोजेक्ट का नियम है।
f-string — मैसेज बनाने का आसान तरीक़ा
स्ट्रिंग के साथ नंबर मिलाना अब तक झंझट वाला था। f-string इसे आसान बना देता है — कोटेशन से पहले एक f, और अंदर कर्ली ब्रैकेट {} में जो चाहें:
name = "Rafi"
items = 3
price = 12.5
print(f"Hello, {name}!")
print(f"{items} items cost {items * price}")
print(f"Rounded: {items * price:.2f}")Hello, Rafi!
3 items cost 37.5
Rounded: 37.50तीन फ़ायदे देखिए: अंदर सीधे हिसाब किया जा सकता है (items * price), टाइप के बारे में सोचना नहीं पड़ता (नंबर अपने-आप स्ट्रिंग में बदल जाता है), और :.2f से तय किया जा सकता है कि दशमलव के बाद कितने अंक दिखें — पैसों की रक़म दिखाते समय यह हर बार चाहिए होता है।
f भूल जाएँ तो क्या होता है, एक बार देख लीजिए:
name = "Rafi"
print("Hello, {name}")Hello, {name}कोई एरर नहीं, बस मैसेज ग़लत है। एक बार आँखों से देख लिया हो तो बाद में पकड़ना आसान होगा।
एक पूरा उदाहरण
account.py:
# Turn a raw form entry into a clean display name and a login id
raw_input_name = " Rafi Ahmed "
domain = "example.com"
clean = raw_input_name.strip()
parts = clean.split(" ")
first_name = parts[0]
last_name = parts[-1]
login_id = f"{first_name.lower()}.{last_name.lower()}"
email = f"{login_id}@{domain}"
initials = f"{first_name[0]}{last_name[0]}"
print(f"Display name : {clean}")
print(f"Login id : {login_id}")
print(f"Email : {email}")
print(f"Initials : {initials}")
print(f"Name length : {len(clean)} characters")Display name : Rafi Ahmed
Login id : rafi.ahmed
Email : [email protected]
Initials : RA
Name length : 10 charactersparts[-1] क्यों? क्योंकि किसी के नाम में तीन हिस्से हो सकते हैं। आख़िरी हिस्सा पीछे से पकड़ें तो नाम दो हिस्सों का हो या तीन का — दोनों में काम करता है।
कुछ टूटी हुई हालतें और उनका हल
IndexError: string index out of range जो इंडेक्स माँगा है वह स्ट्रिंग की लंबाई से बाहर है। याद रखिए, अगर len(word) 6 है, तो सही इंडेक्स 0 से 5 तक हैं। आख़िरी अक्षर चाहिए तो word[-1] सबसे सुरक्षित है।
TypeError: 'str' object does not support item assignment आपने स्ट्रिंग के अंदर का एक अक्षर बदलना चाहा। यह मुमकिन नहीं — नई स्ट्रिंग बनानी होगी, जैसे word = "R" + word[1:]।
मेथड चलाया, लेकिन कुछ नहीं बदला नतीजा कहीं स्टोर नहीं किया गया। name.strip() ख़ुद name को नहीं बदलता; name = name.strip() लिखना होगा।
strip() बीच के स्पेस नहीं हटा रहा strip() सिर्फ़ दोनों सिरों पर काम करता है। बीच वाले हटाने के लिए replace(" ", "") इस्तेमाल कीजिए।
f-string में मैसेज ग़लत आ रहा है देखिए कि कोटेशन से ठीक पहले f है या नहीं। f के बिना कर्ली ब्रैकेट आम अक्षरों की तरह ही प्रिंट होते हैं।
NameError — f-string के अंदर वाला नाम पहचाना नहीं जा रहा कर्ली ब्रैकेट के अंदर जो नाम लिखा है, वह पहले बनाया नहीं गया या उसकी स्पेलिंग ग़लत है।
चरण 4 / 6 — अनुमान
अपनी समझ की जाँच करें
इन चार लाइनों का आउटपुट क्या होगा?
word = "PYTHON"
print(word[0])
print(word[-1])
print(word[1:4])- AP N YTH
- BY N YTHO
- CP O YTH
- DP N YTHO
प्रोग्रामर चाहता था कि Hello, RAFI! प्रिंट हो, लेकिन नाम छोटे अक्षरों में और फ़ालतू स्पेस के साथ ही आ रहा है। क्यों?
name = " rafi "
name.strip()
name.upper()
print(f"Hello, {name}!")- Aएक स्ट्रिंग पर मेथड सिर्फ़ एक बार चल सकता है, दो बार नहीं
- Bf-string के अंदर मेथड का नतीजा नहीं दिखाया जा सकता
- C`strip()` और `upper()` पुरानी स्ट्रिंग नहीं बदलते, नई स्ट्रिंग लौटाते हैं — नतीजा वापस `name` में रखना होगा
- D`upper()` से पहले `strip()` नहीं बुलाया जा सकता, क्रम उल्टा होना चाहिए
यह f-string क्या प्रिंट करेगा?
item = "pen"
qty = 3
price = 12.5
print(f"{qty} x {item} = {qty * price:.2f}")- A3 x pen = 37.50
- B3 x pen = 37.5
- C{qty} x {item} = {qty * price}
- D3 x pen = 3 * 12.5
उत्तर देने के लिए अकाउंट आवश्यक है
अपने उत्तर जाँचने के लिए साइन इन करें
प्रश्न ऊपर दिए गए हैं, और मन में उत्तर सोचना ही मुख्य कार्य है। सही उत्तर, व्याख्या और तीन-स्तरीय संकेत देखने के लिए साइन इन करें।
आपकी बारी
slug.py नाम की एक फ़ाइल लिखिए, जो किसी टाइटल को वेब-एड्रेस में इस्तेमाल लायक़ रूप में बदल दे।
शुरुआती वैल्यू: title = " Learn Python Step By Step "
आउटपुट ऐसा होना चाहिए:
Title : Learn Python Step By Step
Slug : learn-python-step-by-step
Slug length: 25चार शर्तें:
- दोनों सिरों के फ़ालतू स्पेस काटने हैं
- सारे अक्षर छोटे करने हैं
- बीच के स्पेस की जगह डैश लगाना है
- तीनों लाइनें f-string से प्रिंट करनी हैं
फिर एक काम और कीजिए: title की वैल्यू बदलकर " Python for Beginners " कीजिए और चलाइए। कोड बदले बिना भी अगर नए टाइटल के लिए सही जवाब आए, तो इसका मतलब है कि आपने नंबर हाथ से लिखने के बजाय असली हिसाब लिखा है।
इस मिशन में और भी है
ऊपर आपने जो पढ़ा वही पूरा मिशन है — उसमें से कुछ नहीं काटा गया। प्रो इसमें जोड़ता है:
- भीतर वास्तव में क्या होता है — पायथन इसे कैसे निष्पादित करता है
- अभ्यास का संपूर्ण समाधान, चरण-दर-चरण स्पष्टीकरण के साथ
- कठिन अतिरिक्त अभ्यास
- इस विषय पर साक्षात्कार में क्या पूछा जाता है और उसका आदर्श उत्तर
चरण 6 / 6
चुनौती — अध्याय की क्विज़
सरल से कठिन — दस प्रश्न, अंतिम वाले जानबूझकर चुनौतीपूर्ण बनाए गए हैं।
क्विज़ देने के लिए साइन इन करें