স্ট্রিং নিয়ে কাজ — ইনডেক্স, স্লাইস আর f-string
স্ট্রিংয়ের ভেতর থেকে অংশ বের করা, পরিষ্কার করা, বদলানো, আর 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) যদি ৬ হয়, বৈধ ইনডেক্স 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-এর ভেতরের নামটা চেনা যাচ্ছে না কার্লি ব্র্যাকেটের ভেতরে যে নামটা লিখেছেন, সেটা আগে তৈরি হয়নি বা বানানে ভুল আছে।
ধাপ ৪ / ৬ — অনুমান
যাচাই করুন
এই চার লাইনের আউটপুট কী?
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 " দিন এবং চালান। কোড না বদলেও যদি নতুন শিরোনামের জন্য ঠিক উত্তর আসে, তার মানে আপনি সংখ্যা হাতে না লিখে সত্যিকারের হিসাব লিখেছেন।
এই মিশনে আরও কিছু আছে
উপরে যা পড়েছেন সেটাই সম্পূর্ণ মিশন — কিছু কেটে রাখা হয়নি। প্রো এর সাথে যোগ করে:
- ভেতরে আসলে কী ঘটে — পাইথন কীভাবে এটা চালায়
- অনুশীলনীর সম্পূর্ণ সমাধান, ধাপে ধাপে ব্যাখ্যাসহ
- কঠিন অতিরিক্ত অনুশীলনী
- এই বিষয়ে ইন্টারভিউতে যা জিজ্ঞেস করা হয়, আর তার আদর্শ উত্তর
ধাপ ৬ / ৬
কঠিন করা — অধ্যায়ের কুইজ
সহজ থেকে কঠিন — দশটি প্রশ্ন, শেষেরগুলো ইচ্ছে করেই কঠিন।
সাইন ইন করে কুইজ দিন