# স্ট্রিংস

পাইথনে তিন নিয়মে স্ট্রিং তৈরি করা যায়। সিঙ্গেল,ডাবল অথবা ট্রিপল কোট ব্যবহার করে স্ট্রিং লিখা যায়৷

```python
>>> my_string = 'Hello World' 
>>> my_string_two = "Welcome to Python" 
>>>my_string_three = '''I am writing a multiple line string'''
```

মাল্টিপল লাইন স্ট্রিং লিখতে আমরা চাইলে তিনটি ডাবল কোট ও ব্যবহার করতে পারি।

```python
>>> my_string_four = """ String using 
      three double quotes """
```

আমরা যদি চাই স্ট্রিং এর ভিতরেই সিঙ্গেল/ ডাবল কোট ব্যবহার করব তাহলে আমরা পুরো স্ট্রিং টি সিঙ্গেল কোটে লিখলে ভেতরে ডাবল কোট ব্যবহার করব এবং পুরো স্ট্রিং টি ডাবল কোটে লিখলে ভিতরে সিঙ্গেল কোট ব্যবহার করব।

```python
>>> my_string = 'My name is"Ratul" ’ 
>>>my_string = "My name is 'Ratul' "
```

অথবা আমরা চাইলে ট্রিপল কোট ও ব্যবহার করতে পারি।

**স্ট্রিং কনকেটেনেশন(Concatenation)**

পাইথনে একাধিক স্ট্রিং কে যোগ করাকে স্ট্রিং কনকেটেনেটিং বলে। এর জন্য আমরা ' + ' অপারেটর ব্যবহার করি।

```python
>>>name = "Tommy is my dog."
>>>color = "His color is Black"
>>>my_string = name + color
>>>my_string 
Tommy is my dog. His color is Black
```

**স্ট্রিং মেথডস**

স্ট্রিং হচ্ছে এক ধরনের অবজেক্ট। পাইথনে স্ট্রিং এর জন্য কিছু বিল্ট ইন মেথড/ ফাংশন আছে। যেমন আমরা যদি স্ট্রিং কে সম্পূর্ণ আপার/লোয়ার কেজ এ রূপান্তর করতে চাই তাহলে আমরা পাইথনে upper() বা lower() মেথড ব্যবহার করতে পারি।

আবার যদি শুধু মাত্র প্রথম অক্ষর ক্যাপিটালাইজ করতে চাই তখন আমরা capitalize() ফাংশন ব্যবহার করি। স্ট্রিং এর খুবই গুরুত্বপূর্ণ দুটি মেথড হলঃ

**split() ও join()**

split() ফাংশন কোন স্ট্রিং এর প্রতিটি হোয়াইট স্পেস পর পর অংশকে একটি করে এলিমেন্ট হিসেবে নিয়ে লিস্টে ইনপুট করে। join() একটি স্ট্রিং মেথড যা আর্গুমেন্ট হিসবে একটি মাত্র ইটারেবল অবজেক্ট নেয় এবং একটি স্ট্রিং ক্লাসের অবজেক্ট রিটার্ন করে। এটি split() ফাংশনের বিপরীত কাজ করে।

```python
>>>a = ['Programmers','are',"today's","Saints"]
>>>string = " ".join(a)
>>>string
Programmers are today's Saints
>>>string.split()
['Programmers','are',"today's",’Saints’]
>>> string = "-".join(a)
["Programmers-are-today's-Saints"]
```

এছাড়াও আরও কিছু স্ট্রিং ফাংশন হল...

|              |                                                                                      |
| ------------ | ------------------------------------------------------------------------------------ |
| capitalize() | স্ট্রিং এর প্রথম অক্ষর ক্যাপিটাল লেটারে পরিবর্তন করে।                                |
| len()        | স্ট্রিং এর দৈর্ঘ্য নির্ণয় করে।                                                       |
| upper()      | পুরো স্ট্রিং কে আপার কেজ লেটারে পরিবর্তন করে।                                        |
| lower()      | পুরো স্ট্রিং কে লোয়ার কেজ লেটারে পরিবর্তন করে।                                       |
| swapcase()   | আপার কেজ লেটার কে লোয়ার কেজে ও লোয়ার কেজ লেটার কে আপার কেজে রূপান্তর করে।            |
| strip()      | কোন স্ট্রিং এর শুরুর ও শেষের সব হোয়াইট স্পেস রিমোভ করে দিতে এই ফাংশন ব্যবহার করা হয়। |

```python
>>> string = 'hunt Python'
>>> len(string)
11
>>> string.capitalize()
'Hunt python'
>>>
>>> string.upper()
'HUNT PYTHON'
>>>
>>> string.lower()
'hunt python'
>>>
>>> string = 'HuNt PyThOn'
>>> string.swapcase()
'hUnT pYtHoN'
>>>
>>> string = '   a b c   '
>>> string
'   a b c   '
>>> string.strip()
'a b c'
```

পাইথনে অনেক স্ট্রিং মেথড আছে। সব গুলো মেথড দেখতে হলে ইন্টারপ্রেটারে dir(my\_string) কমান্ড টাইপ করলেই হবে৷

**স্ট্রিং স্লাইসিং**

রিয়েল ওয়ার্ল্ড প্রবলেমের ক্ষেত্রে স্ট্রিং স্লাইসিং অনেক বেশি ব্যবহৃত হয়। স্লাইসিং করে স্ট্রিং এর প্রত্যেকটা ক্যারেক্টর একসেস করা যায়।

```python
>>> my_string = "I like Python!"
```

যেহেতু পাইথন জিরো বেজড্ বা জিরো থেকে কাউন্টিং শুরু করে আমরা প্রথম এলিমেন্ট কে জিরো থেকেই কাউন্ট করব।

```
I [space] l  i  k  e [space] p   y  t  h   o    n     ! 
0    1    2  3  4  5    6    7   8  9  10  11   12    13
```

```python
>>>my_string [0:1]
'I'
>>>my_string [0:11]
'I like Pyth'

>>>my_string [0:14]
'I like Python!'

>>>my_string [2:14]
'like Python'

>>>my_string [ : ]
'I like Python’
```

(এখানে লক্ষণীয় যে আমরা ম্যাক্সিমাম লিমিট যত দিচ্ছি পাইথন ঠিক তার আগের সংখ্যা পর্যন্ত কাউন্ট করছে)

**স্ট্রিং ফরম্যাটিং** “স্ট্রিং ফরম্যাটিং” অর্থ হচ্ছে স্ট্রিং কে সুবিন্যস্ত বা গুছিয়ে লিখা। একটা বেজ স্ট্রিং এ অন্য একটি স্ট্রিং/ ইন্টিজার/ ফ্লোট ভ্যালু ইনসার্ট করা।ধরুন আমার ৫ টি আপেল আছে, এখন আমি সেটাকে প্রোগ্রামিং এ কিভাবে লিখব? my\_apples = 5 এবং আমি চাই স্ক্রিনে প্রিন্ট করুক “Ratul has 5 apples”

এখন এই 5 তো ইন্টিজার ভ্যারিয়েবল,যখন আমি ইউজার থেকে একেক বার একেক ডেটা ইনপুট নিব তখন কিভাবে দেখাব? ৫ না হয়ে যদি ১০ হয় কিংবা আমার নামের জায়গায় যদি আপনার নাম হয়? তখন? বার বার তো আর কোড পরিবর্তন করা যাবে না… এই ধরনের সমস্যা এড়ানোর জন্যই মূলত স্ট্রিং ফরম্যাটিং ব্যবহার করা হয়… পাইথনে অনেক ভাবেই স্ট্রিং কে ফরম্যাট করা যায়। সবচেয়ে বেসিক-পুরোনো যে পদ্ধতি সেটা অনেকটা-ই ‘সি’র মতঃ

```python
name = “Ratul”
apples_num = 5
print(“ %s has %i apples” %(name, apples_num))
```

আউটপুটঃ Ratul has 5 apples.

এখানে খেয়াল কর যে আমরা যতগুলো স্ট্রিং ইনপুট দিচ্ছি ততগুলো %s ব্যবহার করছি। কিন্তু আমরা যদি সমান সংখ্যক ইনপুট না দেই তাহলে আমাদের কি এরর দেখাবে?

```python
print(“ %s has %i apples” %(name))
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
TypeError; not enough arguments for formattig string
```

এছাড়াও এই পদ্ধতির একটা সমস্যা হচ্ছে আমাদের আলাদা ডেটা টাইপের জন্য আলাদা আলাদা সিনট্যাক্স ব্যবহার করতে হয়…

সিঙ্গেল ক্যারেক্টারে জন্য %c স্ট্রিং এর জন্য %s ইন্টিজারের জন্য %i এরকম আরো অনেকগুলো আছে, তো এভাবে মনে রাখা কষ্টসাধ্য, কিন্তু পাইথনের কাজই হচ্ছে ব্যাপার গুলো সহজ থেকে সহজতর করা। সে কাজটি করে .format() মেথড… এর মাধ্যমে একটি স্ট্রিং এর মধ্যে থাকা কিছু আর্গুমেন্টকে রিপ্লেস বা সাবস্টিটিউট করা যায়।

```python
>>>name = “Ratul”
>>>apples_num= 5
>>>final_string = “{} has {} apples” .format(name, apples_num)
>>>print(final_string)
Ratul has 5 apples
```

সহজ করে বলি, আমরা final\_string ভ্যারিয়েবলটির ভেতর {} কার্লিব্রেসি (দ্বিতীয় বন্ধনী) দিয়ে কিছু শূন্যস্থান তৈরি করে করেছি, এরপর এর শেষে ফরম্যাট ফাংশনের ভেতর বলে দিয়েছি যে কোন শুন্যস্থান টাকে কোন ভ্যারিয়েবলের মান দিয়ে পূরণ করতে হবে। সেটা কিভাবে হল? আমরা যখন একের পর এক শূণ্যস্থান তৈরি করি পাইথন তখন এদেরকে বাই- ডিফল্ট ইন্ডেক্সিং করে(০ থেকে শুরু) । তার মানে আমাদের প্রথম শূন্যস্থানের ইন্ডেক্স ভ্যালু হচ্ছে ০, দ্বিতীয় শূন্যস্থানের ইন্ডেক্স ভ্যালু হচ্ছে ১… আগের প্রোগ্রামটা-ই যদি একটু অন্যভাবে রান করি তাহলে দেখো কি হয়।

```python
>>>name = “Ratul”
>>>apples_num= 5
>>>final_string = “{0} has {1} apples”.format(name,apples_num)
>>>print(final_string)
Ratul has 5 apples
```

এইবার ও আউটপুট আগের মতই আসবে। এবার আমরা শূন্যস্থানে বলে দিয়েছি কোথায় ফরম্যাট ফাংশনের কোন আর্গুমেন্টের ভ্যালু বসবে মানে এই ইন্ডেক্স এর মান হচ্ছে ফরম্যাট ফাংশনের ইন্ডেক্স এর মান। চল কোডেই বোঝা যাক…

```python
>>>name = “Ratul”
>>>apples_num= 5
>>>final_string = “{0} has {0} apples”.format(name,apples_num)
>>>print(final_string)
```

এর আউটপুট আসবে… Ratul has Ratul apples

ফরম্যাটিংয়ের সময় ইন্ডেক্সগুলো 0, 1, 2…. এইভাবে সিরিয়ালি দিতে হবে ব্যাপারটা কিন্তু এমন না। ইচ্ছে করলেই এগুলো আগে পরে কিংবা একাধিকবার করেও দেয়া যায়।

```python
>>>name = “Ratul”
>>>apples_num= 5
>>>final_string = “{1} has {0} apples and {0} oranges“.format(apples_num,name)
>>>print(final_string)
```

এর আউটপুট আসবে… Ratul has 5 apples and 5 oranges

কিন্তু এই শেষ ও শেষ না। পাইথন ৩.৬ এ পাইথন একটি নতুন স্ট্রিং ফরম্যাটিং লিটারেল নিয়ে আসে। যা “এফ-স্ট্রিংস ফরম্যাটিং” বা “ স্ট্রিং ইন্টারপোলেশন” নামে ও পরিচিত। এবার আমরা শুধু নরমাল স্ট্রিং লিখে যেখানে প্রয়োজন সেখানে {} এর ভেতর ভ্যারিয়েবলের নাম বসিয়ে দিলেই কাজ হয়ে যাবে।

```python
>>>name = “Ratul”
>>>apples_num= 5
>>>print( f”{name} has {apples_num} apples”)
```

এবার ও ঠিক এই আউটপুট টাই পাব। Ratul has 5 apples

ফরম্যাটিং এক্সপ্রেশন্সঃ

| এক্সপ্রেশন |                         অর্থ                         |              উদাহরণ              |
| :--------: | :--------------------------------------------------: | :------------------------------: |
|    {:d}    |                    ইন্টিজার ভ্যালু                   |    '{:d}'.format(10.5) → '10'    |
|   {:.2f}   | ফ্লোটিং পয়েন্ট নাম্বার, দশমিকের পর ২ সংখ্যা বিশিষ্ট। |   '{:.2f}'.format(0.5) → '0.50'  |
|   {:.2s}   |             ২ ক্যারেক্টার বিশিষ্ট স্ট্রিং            | '{:.2s}'.format('Python') → 'Py' |
|   {:<6s}   |          বাম পাশে ৬টি স্পেস বিশিষ্ট স্ট্রিং          | '{:<6s}'.format('Py') → 'Py    ' |
|   {:>6s}   |          ডান পাশে ৬টি স্পেস বিশিষ্ট স্ট্রিং          | '{:<6s}'.format('Py') → '    Py' |
|   {:^6s}   |    বাম-ডান দুই পাশে ৩টি করে স্পেস বিশিষ্ট স্ট্রিং    |   '{:<6s}'.format('Py') →' Py '  |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bangla-python-book.gitbook.io/python-programming-language/data-types/general-types/undefined.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
