স্ট্রিং নিয়ে কাজকারবার

স্ট্রিং (string)-এর সঙ্গে আমরা ইতিমধ্যেই পরিচিত হয়েছি। এই অধ্যায়ে আমরা স্ট্রিং-এর আরো ব্যবহার শিখবো। বেশিরভাগ ক্ষেত্রেই আমরা আলাদা ফাইলে প্রোগ্রাম না লিখে ইন্টারপ্রেটার ব্যবহার করবো, যাতে আমরা উদাহরণগুলো নিজেরা দ্রুত অনুসরণ করতে পারি।

শূণ্য বা তারচেয়ে বেশি সংখ্যক অক্ষর বা চিহ্ন দিয়ে স্ট্রিং তৈরি হয়। স্ট্রিং শুরু ও শেষ করতে হয় ডবল কোটেশন অথবা সিঙ্গেল কোটেশন চিহ্ন ব্যবহার করে। স্ট্রিংয়ে মোট কয়টি অক্ষর আছে, সেটি আমরা বের করতে পারি len() ফাংশন ব্যবহার করে।

>>> s = "hello"
>>> len(s)
5
>>> l = len(s)
>>> l
5
>>> print(l)
5
>>> 
>>> s = '' 
>>> len(s)
0
>>> 
>>> s = ""
>>> len(s)
0
>>>

আবার আমাদের যদি এমন কিছু প্রিন্ট করতে হয়, যেখানে সিঙ্গেল কোটেশন আছে (যেমন Dimik's), তখন আমরা সেটি দুইভাবে করতে পারি :

>>> s = "Dimik's"
>>> print(s)
Dimik's
>>> s = 'Dimik\'s'
>>> print(s)
Dimik's
>>>

একটি স্ট্রিংকে যদিও আমরা একটি ভ্যারিয়েবলে রাখি, আমরা চাইলে প্রতিটি অক্ষর আলাদাভাবে পেতে পারি। s যদি একটি স্ট্রিং হয়, তাহলে প্রথম অক্ষর পাওয়া যাবে s[0]-তে, দ্বিতীয় অক্ষর পাওয়া যাবে s[1]-এ।

>>> country = "Bangladesh"
>>> country[0] 
'B'
>>> country[1] 
'a'
>>> country[2] 
'n'
>>> country[6] 
'd'
>>> country[8] 
's'
>>> country[9] 
'h'
>>> country[10] 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

ওপরের উদাহরণ থেকে আমরা বুঝতে পারছি, স্ট্রিংয়ের দৈর্ঘ্য যদি len হয়, তাহলে প্রথম অক্ষরটি থাকবে 0 ইনডেক্সে আর শেষ অক্ষরটি থাকবে len-1 ইনডেক্সে। আমরা স্ট্রিংয়ের ওপর লুপও চালাতে পারি এভাবে :

>>> for c in country:
...     print(c)
... 
B
a
n
g
l
a
d
e
s
h
>>>

অনেকটা লিস্টের মতোই। কিন্তু লিস্টের সঙ্গে একটি পার্থক্য হচ্ছে, আমরা চাইলে লিস্টের কোনো উপাদান পরিবর্তন করতে পারি, স্ট্রিংয়ের ক্ষেত্রে সেটি সম্ভব নয়।

>>> c = ['A', 'b', 'c']
>>> print(c)
['A', 'b', 'c']
>>> c[0] = 'a'
>>> print(c)
['a', 'b', 'c']
>>> 
>>> country = "Bangladesh"
>>> country[0] = 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>

এজন্য পাইথনের ইংরেজি বইগুলোতে স্ট্রিংকে বলে ইমমিউটেবল (immutable) বা নন-মিউটেবল (non-mutable), কারণ এর পরিবর্তন করা যায় না।

দুটি স্ট্রিং জোড়া লাগানোর জন্য আমরা যোগ চিহ্ন ব্যবহার করতে পারি।

>>> country = "Bangla" + "desh"
>>> print(country)
Bangladesh
>>> x = "50" + "5"
>>> print(x)
505
>>>

এই যোগের কাজটা করতে গিয়ে আমরা অনেকসময় গড়বড় করে ফেলি। তাই একটু সতর্কতা অবলম্বন করতে হবে যে, আমরা আসলে সংখ্যা যোগ করছি নাকি স্ট্রিং জোড়া লাগাচ্ছি।

অনেকসময় আমাদেরকে একটি স্ট্রিংয়ের ভেতরে বিশেষ একটি স্ট্রিং খুঁজে বের করতে হবে। তখন আমরা find() মেথড ব্যবহার করবো। যেমন :

>>> country = "Bangladesh"
>>> country.find("Ban")
0
>>> country.find("ang")
1
>>> country.find("Bangla")
0
>>> country.find("Bengla")
-1
>>> country.find("desh")
6

এখানে আমরা country (অর্থাৎ Bangladesh)-এর ভেতরে বিভিন্ন স্ট্রিং খুঁজে বের করার চেষ্টা করেছি। যদি আমরা যা খুঁজছি, সেটি পাওয়া না যায়, তখন find() মেথড -1 রিটার্ন করে। আর যদি খুঁজে পাওয়া যায়, তাহলে যেই পজিশনে সেটি খুঁজে পাওয়া গিয়েছে, সেই পজিশন বা ইনডেক্স রিটার্ন করে।

আমরা যদি কোনো একটি স্ট্রিংয়ের ভেতরে কোনো কিছু বদলে দিতে চাই, তাহলে আমরা replace() মেথড ব্যবহার করে সেটি করতে পারি। যেমন :

>>> country = "North Korea"
>>> new_country = country.replace("North", "South")
>>> print(new_country)
South Korea
>>> print(country)
North Korea
>>>
>>> text = "this is a test. this is another test. this is final test."
>>> new_text = text.replace("this", "This")
>>> print(new_text)
This is a test. This is another test. This is final test.
>>> print(text)
this is a test. this is another test. this is final test.

ওপরের উদাহরণে আমরা দেখলাম যে, replace() মেথডটি নতুন একটি স্ট্রিং রিটার্ন করে, কিন্তু মূল স্ট্রিংয়ে কোনো পরিবর্তন করে না। তবে আমরা চাইলে আগের স্ট্রিং যেই ভ্যারিয়েবলে রেখেছিলাম, নতুন স্ট্রিংটিও একই ভ্যারিয়েবলে রাখতে পারি। সেক্ষেত্রে একই নামের একটি নতুন ভ্যারিয়েবলে নতুন স্ট্রিং অ্যাসাইন হবে। যদিও আমাদের মনে হতে পারে আগের স্ট্রিং পরিবর্তিত হয়েছে, সেটি আসলে সত্যি নয়, কারণ স্ট্রিং পরিবর্তন করা যায় না, একটু আগেই আমরা সেটি দেখেছি।

>>> text = "hello"
>>> text = text.replace("hello", "Hello")
>>> print(text)
Hello

ওপরে ঘটনা যা ঘটছে, তা হলো, text.replace(“hello”, “Hello”) একটি নতুন স্ট্রিং তৈরি করছে, আর সেটিকে আমরা text ভ্যারিয়েবলেই রাখছি। “hello” স্ট্রিংটি বদলায়নি, বরং নতুন একটি স্ট্রিং তৈরি হয়েছে - এই বিষয়টি খেয়াল রাখতে হবে। প্রোগ্রামিংয়ে যারা নতুন, তাদের হয়ত বুঝতে একটু সমস্যা হতেও পারে, তাতে কোনো অসুবিধা নেই।

স্ট্রিংয়ের শুরুতে ও শেষে অনেক সময় স্পেস ক্যারেক্টার থাকে, যেগুলো আমাদের বাদ দেওয়ার প্রয়োজন হতে পারে। সেজন্য আমরা strip(), lstrip() ও rstrip() মেথড ব্যবহার করতে পারি। lstrip() মেথড স্ট্রিংয়ের বাঁ দিকের স্পেসগুলো বাদ দেবে, rstrip() মেথড ডানদিকের স্পেসগুলো বাদ দেবে, আর strip() মেথড দুইদিকের স্পেসগুলোই বাদ দেবে।

>>> text = " this is a string. "
>>> text
' this is a string. '
>>> text.lstrip()
'this is a string. '
>>> text.rstrip()
' this is a string.'
>>> text.strip()
'this is a string.'
>>> text
' this is a string. '
>>>

ওপরের উদাহরণে আমরা আরো দেখলাম যে text-এর কিন্তু কোনো পরিবর্তন হলো না। কারণ মেথডগুলো আসলে নতুন একটি স্ট্রিং রিটার্ন করে। তাই সেগুলো পেতে চাইলে নতুন কোনো ভ্যারিয়েবলে (কিংবা text ভ্যারিয়েবলে) রাখতে হবে।

>>> text = " this is a string. "
>>> new_text = text.rstrip()
>>> new_text
' this is a string.'
>>> text
' this is a string. '
>>>

আবার আমরা যদি কোনো স্ট্রিংকে আপারকেস (uppercase), লোয়ারকেস (lowercase)-এ রূপান্তর করতে চাই, কিংবা কেবল প্রথম অক্ষরটি বড় হাতের করে দিতে চাই, সেজন্যও ফাংশন তৈরি করা আছে।

>>> s1 = "Bangladesh"
>>> s_up = s1.upper()
>>> s_up
'BANGLADESH'
>>> s_lo = s1.lower()
>>> s_lo
'bangladesh'
>>> s = "hello"
>>> s_cap = s.capitalize()
>>> s_cap
'Hello'

কোনো স্ট্রিংয়ে যদি অনেকগুলো ছোট স্ট্রিং এক বা একাধিক স্পেস দিয়ে আলাদা করা থাকে আর আমরা কেবল সেই ছোট স্ট্রিংগুলো পেতে চাই, তাহলে আমরা split() মেথড ব্যবহার করে সেগুল একটি লিস্টে পেতে পারি।

>>> str = "I   am  a programmer."
>>> words = str.split()
>>> print(words)
['I', 'am', 'a', 'programmer.']
>>> words
['I', 'am', 'a', 'programmer.']
>>> for word in words:
...     print(word)
... 
I
am
a
programmer.
>>>

স্ট্রিংয়ের ভেতরের স্ট্রিংকে সাবস্ট্রিং (sub-string)ও বলে। সেটের যেমন সাবসেট। এখন কোনো স্ট্রিংয়ের ভেতরে একটি স্ট্রিং কতবার আছে, সেটি গণনা করারও একটি সহজ উপায় আছে, count() মেথডের মাধ্যমে।

>>> str = "This is"
>>> str.count("is")
2

কখনো কখনো আমাদের জানার দরকার হতে পারে যে, একটি স্ট্রিংয়ের শুরুতে কিংবা শেষে একটি স্ট্রিং (বা সাবস্ট্রিং) আছে কী নেই। সেজন্য পাইথনে দুটি মেথড তৈরি করা আছে, startswith() ও endswith()। নিচের উদাহরণ দেখলেই বুঝতে পারবো।

>>> s = "Bangladesh"
>>> s.startswith("Ban")
True
>>> s.startswith("ban")
False
>>> s.startswith("an")
False
>>> s.endswith("Ban")
False
>>> s.endswith("desh")
True
>>> s.endswith("h")
True

আমাদের হয়ত এমন লজিকের দরকার হতে পারে যে কারো নাম Mr. দিয়ে শুরু হলে আমরা তাকে Dear Sir বলে সম্বোধন করবো। তখন এরকম কোড লেখা যেতে পারে :

>>> name = "Mr. Anderson"
>>> if name.startswith("Mr."):
...     print("Dear Sir")
... 
Dear Sir

ওপরের প্রোগ্রামটিতে ইনপুট নেওয়ার জন্য আমরা টেক্সটবক্সও ব্যবহার করতে পারি। নিচে টার্টল মডিউল ব্যবহার করে আমরা টেক্সট ইনপুট নিলাম। একটি প্রোগ্রাম অনেকভাবেই লেখা যায়, এটি তার একটি ভালো উদাহরণ।

import turtle

name = turtle.textinput("name", "What is your name?")
name = name.lower()
if name.startswith("mr"):
    print("Hello Sir, how are you?")
elif name.startswith("mrs") or name.startswith("miss") or name.startswith("ms"):
    print("Hello Madam, how are you?")
else:
    name = name.capitalize()
    str = "Hi " + name + "! How are you?"
    print(str)

turtle.exitonclick()

এতক্ষণ স্ট্রিংয়ের নানান রকমের কাজ দেখলাম। ভবিষ্যতে বিভিন্ন প্রোগ্রাম তৈরি করার সময় এগুলো কাজে লাগবে। আর বইতে যা দেখানো হয়েছে, তার বাইরেও অনেক কিছু আছে, সেগুলো আগামী দিনগুলোতে শিখে নিতে হবে। প্রোগ্রামিং নিয়ে তাড়াহুড়া করার কিছু নেই। প্রচুর সময়, ধৈর্য্য, চর্চা ও লেখাপড়া করার বিনিময়ে ভালো প্রোগ্রামার হওয়া সম্ভব। এখন একটি মজার প্রোগ্রাম দিয়ে এই অধ্যায়ের ইতি টানবো।

str = "a quick brown fox jumps over the lazy dog"
for c in "abcdefghijklmnopqrstuvwxyz":
    print(c, str.count(c))

প্রোগ্রামটি রান করে আউটপুট দেখে বুঝতে হবে কেন এটি একটি মজার প্রোগ্রাম।

অনুশীলনী:

  • একটি প্রোগ্রাম লিখতে হবে, যা ইনপুট হিসেবে একটি স্ট্রিং নেবে এবং সেই স্ট্রিং থেকে মোট চারটি স্ট্রিং তৈরি করে স্ক্রিনে প্রিন্ট করবে। প্রথম স্ট্রিংটি হবে কেবল বড় হাতের অক্ষরগুলো নিয়ে, দ্বিতীয় স্ট্রিং হবে কেবল ছোট হাতের অক্ষরগুলো নিয়ে, তৃতীয় স্ট্রিং হবে কেবল অংক (digit) নিয়ে আর বাকী সবকিছু চতুর্থ স্ট্রিংয়ে থাকবে। যেমন, ইনপুট যদি Hello Test! 123 123, good. হয়, তাহলে আউটপুট হবে এমন -
    HT
    elloestgood
    123123
     !  , .
    
  • একটি প্রোগ্রাম লিখতে হবে, যা ইনপুট হিসেবে একটি স্ট্রিং নেবে এবং প্রথম ও দ্বিতীয়, তৃতীয় ও চতুর্থ, পঞ্চম ও ষষ্ঠ - এভাবে পাশাপাশি দুটি অক্ষরকে অদল-বদল করে একটি নতুন স্ট্রিং তৈরি করবে। যেমন, ইনপুট যদি হয় Bangladesh, তাহলে আউটপুট হবে aBgnaledhs।
  • কোনো শব্দকে উল্টো করে সাজালেও যদি আগের মতোই শব্দ পাওয়া যায়, তাকে বলে প্যালিনড্রোম ()। যেমন: madam শব্দটির অক্ষরগুলো উল্টো করে সাজালে আমরা madam পাই। তাই madam একটি প্যালিনড্রোম। আবার toyota শব্দটির অক্ষরগুলো উল্টো করে সাজালে পাওয়া যায় atoyot, তাই এটি প্যালিন্ড্রোম নয়। এখন, একটি প্রোগ্রাম লিখতে হবে, যেটি ব্যবহারকারীর কাছ থেকে একটি স্ট্রিং ইনপুট নেবে এবং স্ট্রিংটি প্যালিনড্রোম কী না, সেটি বলে দেবে।

results matching ""

    No results matching ""