String (স্ট্রিং)

স্ট্রিং কি?
স্ট্রিং এক ধরনের ডাটা টাইপ যা সকল প্রোগ্রামিং ল্যাংগুয়েজ এ দেখা যায়। স্ট্রিং বাইটস অ্যারে টাইপ এর ডাটা স্ট্রাকচার যা ক্যারেক্টার এর সিক্যুয়েন্স কে ভ্যারিয়েবেল অথবা লিটেরেল কন্সটেন্ট হিসেবে ধরে রাখে।
পাইথন এ স্ট্রিং প্রকাশ করতে একটি, দুইটি অথবা তিনটি উদ্ধৃতি-চিহ্ন ব্যবহার করা হয়। তিনটি উদ্ধৃতি-চিহ্ন ব্যবহার করা হয় সাধারণত অনেক বড় স্ট্রিং কে ধারণ করতে।
single_quote_string = 'hello pythonista!'
print(type(single_quote_string))


double_quote_string = "hello pythonista!"
print(type(double_quote_string))


triple_quote_string = ''' In some ways, programming is like painting. You start with a blank canvas and certain basic raw materials. You use a combination of science, art, and craft to determine what to do with them. '''
print(type(triple_quote_string))


# Output:
# <class 'str'>
# <class 'str'>
# <class 'str'>

 

স্ট্রিং মূলত অ্যারেঃ
অন্যান্য প্রোগ্রামিং ল্যাংগুয়েজ এর মত পাইথনেও স্ট্রিং অ্যারে এর মত কাজ করে। এক্ষেত্রে, তা বাইটস টাইপ এর অ্যারে হিসেবে থাকে। অ্যারে কে যেভাবে ট্রাভার্স করা যায়, স্ট্রিং কেও একই ভাবে ট্রাভার্স করা যায়।
string_example = "Hello pythonistas!"
traversed_data =[s for s in string_example]
print(traversed_data)

#Output:
#['H', 'e', 'l', 'l', 'o', ' ', 'p', 'y', 't', 'h', 'o', 'n', 'i', 's', 't', 'a', 's', '!']

 

স্ট্রিং এর যে কোন মান আমরা ইনডেক্স এর মাধ্যমে পেতে পারি –
string_example = "Hello pythonistas!" 
print(string_example[6])

# Output:
# p

খেয়াল রাখতে হবে যেন নির্ধারিত ইনডেক্স গুলো স্ট্রিং এর রেঞ্জ এর মধ্যে থাকে। তা না হলে, পাইথন কম্পাইলার আমাদেরকে ইরর জেনারেট করে দিবে।

string_example = "Hello pythonistas!"
print(string_example[30])

# Output:
# IndexError: string index out of range

 

স্ট্রিং এর ইনডেক্স অবশ্যই ইন্টিজার হতে হবে-

string_example = "Hello pythonistas!"
print(string_example[1.5])

# Output:
# TypeError: string indices must be integers

 

আমরা স্ট্রিং এর লেন্থ ও জানতে পারি len() ফাংশন এর মাধ্যমে-
string_example = "Hello pythonistas!"
print('The length of string is: ',len(string_example))

# Output:
# The length of string is: 18
 
উপরের উদাহরণ গুলোতে আমরা সিঙ্গেল কোট ও ডাবল কোট ব্যবহার করে দেখলাম । তবে দুই ক্ষেত্রেই কিছু প্রবলেম আছে । প্রথমত সিঙ্গেল কোট আর ক্ষেত্রে একটা উদাহরণ দেখবো ।
city = 'Cox's Bazar'
print(city)

উপরের কোড টি যদি রান করি তাহলে আমরা আউটপুট হিসেবে SyntaxError: invalid syntax এই এরর টি থ্রো করবে । এর কারণ হলো পাইথন যখন কোনো স্ট্রিং এ ‘ ‘ চিহ্ন পায় তখন সে এটিকে একটি পরিপূর্ণ স্ট্রিং হিসেবে ধরে নেয় কিন্তু এর পরে যখন আবার ‘ চিহ্ণ পায় তখন এইটি কে সিনটেক্সগত ভুল হিসেবে ধরে নেয় এবং SyntaxError থ্রো করে ।এই প্রব্লেম থেকে বাঁচার জন্য আমরা সহজেই ডাবল কোট আর ভিতরে সিঙ্গেল কোট আবহার করতে পারি । অর্থাৎ city = “Cox’s Bazar” এই ভাবে আমরা লিখতে পারি ।

এইবার আমরা ডাবল কোট এর একটি উদাহরণ দেখবো

company_info = "Vivasoft is a "leading" software development company based in Bangladesh "
print(company_info)

উপরের কোড টি যদি রান করি তাহলেও আমরা আউটপুট হিসেবে SyntaxError: invalid syntax এই এরর টি থ্রো করবে । এর কারণ ঠিক আগের মতোই । পাইথন যখন কোডটি রান করে তখন “Vivasoft is a ” এই পর্যন্ত অর্থাৎ leading এর আগ পর্যন্ত একটা পরিপূর্ণ স্ট্রিং মনে করে এবং আর পরে যখন আবার ডাবল কোট পায় তখন এটিকে সিস্ট্যাক্সগত ভুল মনে করে তাই SyntaxError থ্রো করে । এই প্রব্লেম থেকে বাঁচার জন্য আমরা সহজেই ডাবল কোট আর ভিতরে সিঙ্গেল কোট আবহার করতে পারি । অর্থাৎ company_info = “Vivasoft is a ‘leading’ software development company based in Bangladesh ” এই ভাবে আমরা লিখতে পারি ।

আমরা চাইলে সিঙ্গেল কোট আর ভিতরে ডাবল কোটও ব্যবহার করে স্টিং লিখতে পারি সেক্ষত্রে আপনার প্রয়োজন কিনা সেইটা আর উপর নির্ভর করবে ।

company_info = 'Vivasoft is a "leading" software development company based in Bangladesh '
print(company_info)

#Output:
#Vivasoft is a "leading" software development company based in Bangladesh

 

 
কিছু স্ট্রিং অপারেশনসঃ
১। আমরা কোন ক্যারেক্টার বা সাব স্ট্রিং কোন স্ট্রিং এ আছে কিনা তা জানতে পারি-
string_example = "Hello pythonistas!"
print("python" in string_example)
print("coder" in string_example)


# Output:
# True
# False

 

 
২। স্ট্রিং স্লাইসিং আমরা পাইথন লিস্ট বা অ্যারে এর মত স্ট্রিং কে ইনডেক্স ধরে কেটে ফেলতে পারি।
string_example = "Hello pythonistas!"
print(string_example[5:12])


# Output:
# python

 

৩।স্ট্রিং কনক্যাটানেশনঃ স্ট্রিং কনক্যাটানেশন মূলত বুঝায়, দুই বা ততোধিক স্ট্রিং কে একটি স্ট্রিং আকারে প্রকাশ করা। পাইথনে স্ট্রিং কনক্যাটানেশন করা অনেক সহজ। আলাদা স্ট্রিং গুলোকে যোগ(+) চিহ্ন দিয়ে একসাথে লিখলেই স্ট্রিং কনক্যাটানেশন হয়ে যায়। এ যেন অঙ্কের যোগ এর মতই। একটি উদাহারন দেখা যাক-
string_1 = "Hello " 
string_2 = "pythonistas!" 
concatanated_string = string_1 + string_2 
print(concatanated_string) 

# Output: 
# Hello pythonistas!

 

এই ভাবে দুই বা ততোধিক স্ট্রিং কে একটি স্ট্রিং আকারে প্রকাশ করা যায়।
স্ট্রিং কনক্যাটানেশন এর মজার একটা ব্যপার আছে। একটু গল্প করে মজার জিনিসটা শিখে নেয়া যাক। আমাদের স্কুল জীবনে আমরা কেউ কেউ একটা শাস্তি পেয়েছি, অমুক লাইনটি ১০০ বার লিখ। এখন এই শাস্তিটি পেলে ভালই হত। লুপ চালিয়ে ১০০ বার কেন, যত বার খুশি লিখে ফেলা যেত। আপনারা অনেকে তা চিন্তা করে ফেলেছেন। লুপ চালিয়ে তো করা যাবেই, কিন্তু পাইথনে আরো সহজে তা করে ফেলা যায় স্ট্রিং কনক্যাটানেশন এর ধারনা থেকে। একটি উদাহারন দেখে ফেলা যাক-
string_1 = "I will do my homework from tomorrow!, "

concatanated_string = string_1 * 5
print(concatanated_string)


# Output:
# I will do my homework from tomorrow!, I will do my homework from tomorrow!, I will do my homework from tomorrow!, I will do my homework from tomorrow!, I will do my homework from tomorrow!,

 

৪। স্ট্রিং মডিফিকেশনঃ স্ট্রিং এর উপর আমরা কিছু মডিফিকেশন করতে পারি,
 
    * স্ট্রিং এর সকল উপাদান কে আপার কেস করাঃ
string = "hello, pythonistas!"
upper_cased_string = string.upper()
print(upper_cased_string)


# Output:
# HELLO, PYTHONISTAS!
 
   * স্ট্রিং এর সকল উপাদান কে লোয়ার কেস করাঃ
string = "HELLO, PYTHONISTAS!"
lower_cased_string = string.lower()
print(lower_cased_string)


# Output:
# hello, pythonistas!

 

    * স্ট্রিং হতে হোয়াইট স্পেস অপসারনঃ স্ট্রিং এর শুরু বা শেষের হোয়াইট স্পেস অপসারন করতে আমরা strip() মেথড ব্যবহার করে থাকি। স্ট্রিং এর মাঝের হোয়াইট স্পেস এই মেথড ব্যবহার করে অপসারন করা যায় না।
 
string = " hello, pythonistas! "
striped_string = string.strip()
print(striped_string)


# Output:
# hello, pythonistas!

 

   * স্ট্রিং এর উপাদান রিপ্লেসঃ replace() ব্যবহার করে আমরা স্ট্রিং এর কোন উপাদান কে চাইলে রিপ্লেস করতে পারি।
string = "hello, pythonistas!"
replaced_str_exp = string.replace(',', '?')
print(replaced_str_exp)


# Output:
# hello? pythonistas!

 

  * স্ট্রিং স্প্লিটিংঃ স্ট্রিং স্প্লিটিং স্ট্রিং ম্যানিপুলেশন এর অন্যতম প্রয়োজনীয় একটি অপারেশন। স্ট্রিং স্প্লিটিং এর ক্ষেত্রে যে সেপারেটর সিলেক্ট করে দেয়া হয় তা বরাবর স্ট্রিং কে আলাদা করে লিস্ট টাইপ ডাটা টাইপ এ কনভার্ট করে দেয়া হয়। এক্ষেত্রে কোন সেপারেটর সিলেক্ট করে না দেয়া হলে, বাই ডিফল্ট স্পেস বরাবর স্প্লিট হয়।

 

আরও কিছু বিল্ট-ইন স্ট্রিং ফাংশনঃ

* স্ট্রিং ইন্যুমিরেশনঃ  enumerate() ফাংশন এর মাধ্যমে কোন স্ট্রিং এর প্রত্যেকটি উপাদান কে ইনডেক্স এর মাধ্যমে প্রকাশ করা যায়-
string = "hello, pythonistas!"
## enumerate()
list_enumerate = list(enumerate(string))
print(list_enumerate)


# Output:
# [(0, 'h'), (1, 'e'), (2, 'l'), (3, 'l'), (4, 'o'), (5, ','), (6, ' '), (7, 'p'), (8, 'y'), (9, 't'), (10, 'h'), (11, 'o'), (12, 'n'), (13, 'i'), (14, 's'), (15, 't'), (16, 'a'), (17, 's'), (18, '!')]

 

* find() ফাংশন এর মাধ্যমে কোন স্ট্রিং এর মধ্যে কোন সাব-স্ট্রিং আছে কিনা তা জানা যায়। এক্ষেত্রে, সাব-স্ট্রিং এর শুরু হওয়ার ইনডেক্স রিটার্ন করে।
string = "How you doing, pythonistas?" 
sub_string="do" 
find_func = string.find("do") 
print(find_func) 

# Output:
# 8

 

 
* format() মেথড এর মাধ্যমে ডাইনামিক মান কে স্ট্রিং এর মধ্যে যে কোন জায়গায় বসানো যায়। স্ট্রিং এর মধ্যে কারলি ব্রেসেস({}) এর মাধ্যমে ডাইনামিক মান গুলোকে বসানো হয়। {}, ডাইনামিক মান গুলোকে প্লেস হোল্ডার হিসেবে কাজ করে। একটি উদাহারন দেখা যাক-
 
string = "Naaz got {} chocolates at her {}".format(25, "birthday")
print(string)

# Output:
# Naaz got 25 chocolates at her birthday

 

* join() ফাংশন ইটারেবল কোন ডাটা স্ট্রাকচার থেকে উপাদান গুলো নেয় এবং তা পর পর জোড়া দিয়ে একটি স্ট্রিং রিটার্ন করে।
iterable_tuple = ("farhan", "raju", "rancho")
three_idiots = ", ".join(iterable_tuple)
print(three_idiots)

# Output:
# farhan, raju, rancho

 

* split() ফাংশন এর মাধ্যমে কোন স্ট্রিং, কোন সেপারেটর এর মাধ্যমে উপাদান এ বিভক্ত হয়ে যায় এবং একটি উপাদানের লিস্ট রিটার্ন করে। কোন সেপারেটর নির্ধারন করে দেয়া না হলে, হোয়াইট স্পেস এর জায়গা গুলুতে স্প্লিট হয়।
 
string = "what makes you different, makes you strong"
print(string.split(","))
print(string.split())

# Output:
# ['what makes you different', ' makes you strong']
# ['what', 'makes', 'you', 'different,', 'makes', 'you', 'strong']

 

স্পেশালঃ

১। স্ট্রিং ইমিউটেবল বা অপরিবরতনযোগ্যঃ এর মানে হল, স্ট্রিং এর উপাদান কে পরিবর্তন করা যায় না একবার একটি স্ট্রিং নির্ধারণ করে দেয়া হলে, কিন্তু একই নাম দিয়ে পুনঃরায় নির্ধারণ করা যায়।
string_example = "Hello pythonistas!"
print(string_example[5:12])


# Output:
TypeError: 'str' object does not support item assignment

 

২।আমরা একটি স্ট্রিং থেকে কোন ক্যারেক্টার মুছে ফেলতে পারি না। কিন্তু স্ট্রিং সম্পূর্ণরূপে মুছে ফেলা সম্ভব del কীওয়ার্ড ব্যবহার করে।
string_example = "Hello pythonistas!"
del string_example[4]


# Output:
# TypeError: 'str' object doesn't support item deletion


string_example = "Hello pythonistas!"
del string_example
print(string_example)


# Output:
# NameError: name 'string_example' is not defined
 
উদাহরন

উদাহরন ১

my_string = 'this is a paragraph'

# Capitalize the string above
print("1. "+my_string.capitalize())


key = "HELLO"

# lower all character of above string
print("2. "+key.lower())


key2 = "some"

# upper all character of above string
print("3. "+key2.upper())



heading = "this is a title"

# Make first letter of all words capital
print("4. "+heading.title())


my_list = ["I","am","learning","python"]

# make a string to above list
print(" ".join(my_list))

 

উদাহরন ২

#Using single quotes
str = 'Hello Bud'
print(str)
#Using double quotes
str1 = "Howwdyy"
print(str1)

#Using triple quotes
str2 = '''How are you buddy!!'''
print(str2)

উদাহরন ৩

# characters of String

str1 = "VivaSoftLimited"
print(str1)

# Printing First character
print("\nFirst character of String is: ")
print(str1[0])

# Printing Last character
print("\nLast character of String is: ")
print(str1[-1])

উদাহরন ৪

# Formatting of Strings

str1 = "{} {} {}".format('Vivasoft', 'For', 'Life')
print("Print String in default order: ")
print(str1)

# Positional Formatting
str1 = "{1} {0} {2}".format('Is', 'Awesome','Here')
print("\nPrint String in Positional order: ")
print(str1)

# Keyword Formatting
str1 = "{l} {f} {g}".format(g='us', f='join', l='Come')
print("\nPrint String in order of Keywords: ")
print(str1)

উদাহরন ৫

 

int1 = 12.3456789
print("Formatting in 3.2f format: ")
print('The value of int1 is %3.2f' % int1)
print("\nFormatting in 3.4f format: ")
print('The value of int1 is %3.4f' % int1)

 

এসো নিজে করি
১. [“my”,”city”] কে “my-city” বানানোর কোড লিখুন
২. যেকোনো স্ট্রিং এর প্রথম এবং শেষ লেটার নিয়ে আরেকটি স্ট্রিং বানান
৩. যেকোনো স্ট্রিং এর একদম মাঝের লেটারটি প্রিন্ট করুন
৪. নিম্নলিখিত স্ট্রিং-এ প্রতিটি বিশেষ প্রতীক # দিয়ে প্রতিস্থাপন করুন
    str1 = ‘/*Jon is @developer & musician!!’
৫. হাইফেনে একটি প্রদত্ত স্ট্রিং বিভক্ত করার জন্য একটি প্রোগ্রাম লিখুন এবং প্রতিটি সাবস্ট্রিং প্রদর্শন করুন।
      str1 = Mimbo-is-a-data-scientist
ইন্টারভিউ প্রশ্নোত্তর
গুরুত্বপূর্ন প্রশ্নসমুহ
* ‘string is immutable’ বলতে কি বুঝায় ?
* ‘100men’ এই স্ট্রিং কে capitalize() করলে আউটপুট কি আসবে ?
* ‘strings are array of characters’ – ব্যাখ্যা দিন ।
* দীর্ঘতম প্যালিনড্রোমিক সাবস্ট্রিং বের করুন
* Serialize and Deserialize Binary Tree