স্ট্রিং ম্যানিপুলেশন

আগেই আমরা জেনেছি: সিঙ্গেল কোট বা ডাবল কোটের ভিতরে যাই থাকে তাকেই স্ট্রিং বলে। স্ট্রিং হল টেক্সট বা কোন লেখা। (ডকস্ট্রিংকে হিসাবের বাইরে রাখলে) পাইথনে স্ট্রিং দুইভাবে ডিক্লেয়ার করা যায়। সিঙ্গেল কোট দিয়ে অথবা ডাবল কোট দিয়ে। দুইটারই সুবিধা-অসুবিধা রয়েছে।

>>> a = 'bangla'
>>> b = "desh"
>>> type(a)
<class 'str'>
>>> type(b)
<class 'str'>

এই উদাহরণে আমরা সিঙ্গেল কোট আর ডাবল কোট উভয়েরই ব্যবহার দেখলাম। সিঙ্গেল কোটের কিছু অসুবিধা আছে। আমরা যদি স্ট্রিংয়ের ভিতরে কোন শব্দে বা বাক্যের কোন অংশে কোট চিহ্ন দিতে চাই তাহলে কি হয় দেখা যাক:

>>> c = 'Bangladesh is my 'motherland', I love her very much.'
  File "<stdin>", line 1
    c = 'Bangladesh is my 'motherland', I love her very much.'
                                    ^
SyntaxError: invalid syntax

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

>>> c = "Bangladesh is my 'motherland', I love her very much."
>>> c
"Bangladesh is my 'motherland', I love her very much."

আচ্ছা, ডাবল কোটের ভিতর যদি ডাবল কোট ব্যবহার করি কোন কারণে, তখন কি হবে? দেখা যাক:

>>> c = "Bangladesh is my "motherland", I love her very much."
  File "<stdin>", line 1
    c = "Bangladesh is my "motherland", I love her very much."
                                    ^
SyntaxError: invalid syntax

আবার সেই সিনট্যাক্স এরর। সুতরাং বিষয়টা একটু ভজকটে, বোঝাই যাাচ্ছে। তাহলে আমাদের একটা ভাল সলিউশন খুঁজে পাওয়া দরকার। আর সেটা হচ্ছে \ চিহ্ন বা ব্যাকস্লাশ ব্যবহার করা। ব্যাকস্লাশ তার ঠিক পরের সিঙ্গেল কোট বা ডাবল কোট ক্যারেকটারটা এস্কেপ করে যায়।

>>> c = "Bangladesh is my \"motherland\", I love her very much."
>>> c
'Bangladesh is my "motherland", I love her very much.'

একটু আগে সিঙ্গেল কোটের ক্ষেত্রে যে প্রব্লেমটা সলভ করলাম আমরা সেটাও কিন্তু একই উপায়ে সলভ করা যায়:

>>> c = 'Bangladesh is my \'motherland\', I love her very much.'
>>> c
"Bangladesh is my 'motherland', I love her very much."

একটা ব্যাকস্লাশ প্রিন্ট করতে গেলে একটু কারিশমার দরকার পড়ে। কারিশমাটা হল, দুইটা ব্যাকস্লাশ দিলে একটা ব্যাকস্লাশ প্রিন্ট হয়। তাছাড়া পাইথনে \n দিয়ে নিউ লাইন আর \t দিয়ে ট্যাব প্রিন্ট করা হয়।

>>> print('\')
  File "<stdin>", line 1
    print('\')
             ^
SyntaxError: EOL while scanning string literal
>>> print('\\')
\
>>> print('\\')
\
>>> print('\n')


>>> print('\t')

>>>

স্ট্রিংয়ে ভ্যালু অ্যাক্সেস

আমাদের প্রথম উদাহরণটায় ফিরে আসি। এখানে a ও b এর যে ভ্যালু আমরা অ্যাসাইন করেছি তা আমরা কিভাবে অ্যাক্সেস করতে পারি? খুব সহজ ভাবে করতে গেলে নিচের মত করে:

>>> a = 'bangla'
>>> b = "desh"
>>> a
'bangla'
>>> b
'desh'

স্বাভাবিক আমরা এভাবেই ভ্যালু অ্যাক্সেস করতে পারি। আচ্ছা, আমাদের মনে কি কখনো প্রশ্ন জেগেছে যে স্টিং ভ্যারিয়েবলে কিভাবে থাকে? এই যে আমরা a ভ্যারিয়েবলে ৬ ক্যারেক্টারের bangla কে অ্যাসাইন করলাম এর প্রতিটা ক্যারেক্টার a এর বিভিন্ন ইনডেক্সের ভিতর থাকে। ইনডেক্স অনেকটা বহুতল ভবনের মত। জায়গা একটাই কিন্তু প্রতি তালায় ভিন্ন ভিন্ন বাসায় লোক থাকতে পারে। বিল্ডিংয়ে আমরা নিচের তলাকে গ্রাউন্ড ফ্লোর বলি আর 0 দিয়ে প্রকাশ করতে পারি। তারপর প্রথম তলাটাকে 1 দিয়ে, ২য় তলাটাকে 2 দিয়ে। এভাবে।ইনডেক্সের আইডিয়াও সেরকম। স্ট্রিংয়ের ইনডেক্স সবসময় 0 দিয়েই শুরু হবে। তাহলে bangla এই ছয়টা ক্যারেক্টারের জন্য ইনডেক্সিংটা কিরকম হবে? হুম, 0, 1, 2, 3, 4, 5 এরকম। 5 এ গিয়ে শেষ হবে। 6 কিন্তু হবে না, কারণ আমরা 0 দিয়ে শুরু করেছি। এবার কিভাবে স্ট্রিংয়ে ভ্যালু অ্যাক্সেস করব তার একটা উদাহরণ দেখি:

>>> a = 'bangla'
>>> a[0]
'b'
>>> a[1]
'a'
>>> a[2]
'n'
>>> a[3]
'g'
>>> a[4]
'l'
>>> a[5]
'a'
>>> a[6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

আমরা অনেকেই হয়ত বুঝে ফেলেছি যে ভ্যারিয়েবলের পরে [] চিহ্নের ভিতরে ইনডেক্স নম্বর দিয়ে ভ্যালু অ্যাক্সেস করতে পারা যায়। শেষে একটা এরর থ্রো করেছে পাইথন, খেয়াল করেছেন? কারণ কি? আমরা আগেই জেনেছি যে যেহেতু ক্যারেক্টার ছয়টা তাই ইনডেক্স নম্বর 0 থেকে 5 অবধি হবে। 6 এ তো কোন কিছু নাই, তাই IndexError থ্রো করেছে পাইথন।

আমরা কিন্তু চাইলে একটা নির্দিষ্ট সীমার ইনডেক্সের ভ্যালু অ্যাক্সেস করতে পারি। যেমন:

>>> a[1:4]
'ang'

আমরা শুধু ইনডেক্স 1 থেকে 4 পর্যন্ত ভ্যালুগুলো অ্যাক্সেস করেছি এখানে। 4 পর্যন্ত বলতে বুঝায় 1, 2, 3 নম্বর ইনডেক্স, 4 নয় কিন্তু। আমরা চাইলে প্রথম তিনটা বা শেষ ২ টা ভ্যালুকে আরো সহজে অ্যাক্সেস করতে পারি।

>>> a[:1]
'b'
>>> a[:2]
'ba'
>>> a[:3]
'ban'
>>> a[2:]
'ngla'
>>> a[4:]
'la'
>>> a[-1]
'a'
>>> a[-2]
'l'

a[:2] দিয়ে প্রথম দুইটা ভ্যালু অ্যাক্সেস করা যায়। অন্যদিকে a[2:] দিয়ে বুঝায় প্রথম দুইটা ভ্যালু বাদ দিয়ে দেখাও। মানে প্রথম দুইটা ভ্যালু বাদ দিয়ে বাকিগুলো দেখাবে পাইথন। এইজন্যই a[4:] দিয়ে আমরা প্রথম চারটা ক্যারেক্টার বাদ দিয়ে শেষের দুইটা ক্যারেক্টার পেয়েছি। আর a[-1] দিয়ে বুঝায় শেষ দিক থেকে প্রথম ভ্যালুটা দেখাও। তেমনকি করে a[-2] দিয়ে বুঝায় শেষ দিক থেকে দ্বিতীয় ভ্যালুটা দেখাও। কি মজা! তাই না? স্ট্রিংয়ের ইনডেক্স তো দেখলাম আমরা। একটা জিনিস ভেবে দেখেছি কি যে এই ইনডেক্সের ভ্যালুগুলো আপডেট করা যায় কিনা? আপনি চেষ্টা করুন, বাকি আমরা একটু জিরিয়ে নেই।

স্ট্রিং ফরম্যাটিং

আমাদের বইয়ের একেবারে শুরুর দিকে আমরা print() ফাংশনের ব্যবহার শিখেছি। এটা দিয়ে আমরা যেকোন কিছু স্ক্রীনে প্রিন্ট করে দেখতে পারি।

>>> a = 'bangla'
>>> print(a)
bangla

আমরা a ভ্যারিয়েবলে 'bangla' স্ট্রিং অ্যাসাইন করেছি। পরে a এর ভ্যালু প্রিন্ট করে দেখেছি। এবার জিনিসটাকে আরেকটু মশলাদার করা যাক:

>>> a = 'bangla'
>>> print(a)
bangla
>>> print('My favorite language is:', a)
My favorite language is: bangla

আমরা এখানে উপরের উদাহরণের তুলনায় মাত্র একটা স্টেটমেন্ট বেশি লিখেছি। এখানে আমরা a ভ্যারিয়েবলকে আরেকটু মশলাদার করে প্রিন্ট করেছি মাত্র। কাজটা চাইলে স্ট্রিং ফরম্যাটিং অপারেটর % দিয়ে করা যায়। আসলে এই ফিচারটা পাইথনের ভিতরে সি এর printf() ফাংশনের ক্ষমতা এনে দিয়েছে। উপরের কাজটাই এবার করা যাক আবার:

>>> print('My favorite language is: %s' %a)
My favorite language is: bangla

কি চমৎকার কাজ করল! এই যে এখানে আমরা %s সিম্বলটা ব্যবহার করেছি, এটা হল স্ট্রিং ফরম্যাট সিম্বল। ইন্টিজারের জন্য %d, ফ্লোটের জন্য %f এরকম আলাদা আলাদা ফরম্যাট সিম্বল রয়েছে। বিশেষ করে দশমিকের পর কয়ঘর অবধি আমরা ডিজিট দেখাতে চাই তার জন্য %f খুবই কাজের জিনিস।

>>> number = 436.15757823658945
>>> print(number)
436.1575782365895
>>> print('%.2f' % number)
436.16
>>> print('%.4f' % number)
436.1576
>>> print('%.1f' % number)
436.2
>>> print('%.5f' % number)
436.15758

% এর পর . দিয়ে যে ইন্টিজারটার দেব আমরা, দশমিকের পর সেই কয়ঘর পর্যন্তই ডিজিট প্রিন্ট হবে। এখন আমরা আরেকটু জটিল একটা কাজ করব।

>>> a = input()
Bangla
>>> b = input()
English
>>> print('My favorite languages are:', a, 'and', b)
My favorite languages are: Bangla and English

এখানে গতানুগতিক ধারায় আমরা কাজটা করেছি। a আর b তে দুইটা ল্যাঙ্গুয়েজের নাম স্ট্রিং হিসাবে ইনপুট নিয়েছি। তারপর একটা সুন্দর লাইন বানিয়ে প্রিন্ট দিয়েছি। কাজটা স্ট্রিং ফরম্যাটিং অপারেটর ব্যবহার করেও করতে পারি:

>>> a = input()
Bangla
>>> b = input()
English
>>> print('My favorite languages are: %s and %s' %(a, b))
My favorite languages are: Bangla and English

এখন মাথায় আসতে পারে এই ফরম্যাটিংয়ের বিষয়টা আমরা শিখলাম কেন? আসলে এটাও শিখেছি অনলাইন জাজের কথা চিন্তা করে। সামনে যখন আমরা বিভিন্ন অনলাইন জাজের সমস্যাগুলো সলভ করব তখন আমাদের অনেক ক্ষেত্রেই এরকম এক লাইনে অনেক ভ্যারিয়েবল প্রিন্ট দেয়া লাগতে পারে, স্ট্রিং ফরম্যাট করা লাগতে পারে। তাই আগেভাগেই আমরা শিখে রাখলাম। কি চমৎকার! তাই না?

স্ট্রিং জোড়াতালি

এখন আমরা স্ট্রিং নিয়ে খেলব। এরজন্য a ও b দুইটা স্ট্রিং ভ্যারিয়েবল ডিক্লেয়ার করে নেব আমরা।

>>> a = 'bangla'
>>> a
'bangla'
>>> b = 'desh'
>>> b
'desh'

একটা জিনিস কি খেয়াল করেছি আমরা? a আর b কে একসাথে জোড়া দিতে পারলেই কিন্তু বের হয়ে আসবে আমাদের প্রিয় মাতৃভূমি বাংলাদেশের নাম। কিন্তু জোড়া দেব কিভাবে? খুবই সহজ কাজ। + অপারেটর ব্যবহার করে আমরা দুইটা স্ট্রিংকে জোড়া দিতে পারি। ইংরেজিতে একে কংক্যাটেনশন বলে।

>>> a = 'bangla'
>>> a
'bangla'
>>> b = 'desh'
>>> b
'desh'
>>> a+b
'bangladesh'

আচ্ছা এবার আমরা আলাদা তিনটা ভ্যারিয়েবল নেব x, y, z। এদের ভ্যালু হবে যথাক্রমে 'dhaka', 'barisal', 'sylhet'। এবার আমরা এই তিনটা ভ্যারিয়েবলকে জোড়া দেব। তবে শর্ত হল, জোড়া দেবার জায়গায় - চিহ্নটা থাকতে হবে।

>>> x = 'dhaka'
>>> x
'dhaka'
>>> y = 'barisal'
>>> y
'barisal'
>>> z = 'sylhet'
>>> z
'sylhet'
>>> x + '-' + y + '-' + z
'dhaka-barisal-sylhet'

ঠিক আছে তাই না? আমরা কিন্তু এই কাজটা আরো সহজে করতে পারতাম join() ফাংশন দিয়ে।

>>> x = 'dhaka'
>>> x
'dhaka'
>>> y = 'barisal'
>>> y
'barisal'
>>> z = 'sylhet'
>>> z
'sylhet'
>>> '-'.join((x, y, z))
'dhaka-barisal-sylhet'

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

বড় করি, ছোট করি

a এর ভ্যালু 'bangla', b টা ছোট হাতের। আমরা এটাকে বড় হাতের বানাব। এজন্য আমরা capitalize() ফাংশন ব্যবহার করব। এই ফাংশন কোন স্ট্রিংয়ের প্রথম ক্যারেক্টারটাকে বড় হাতের বানায়।

>>> a.capitalize()
'Bangla'

যদি সবগুলো ক্যারেক্টারকেই বড় হাতের করতে চাইতাম তবে upper() ফাংশন ব্যবহার করতে হত।

>>> a.upper()
'BANGLA'

আমরা একটা বাক্য গঠন করলাম: they're bill's friends from the UK. এখন আমরা যদি এই বাক্যের প্রতিটা শব্দের প্রথম অক্ষরকে বড় হাতের করতে চাই তবে আমাদেরকে title() ফাংশন ব্যবহার করতে হবে।

>>> "bangladesh is my motherlans. i just love her.".title()
'Bangladesh Is My Motherlans. I Just Love Her.'

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

>>> 'BANGLA'.lower()
'bangla'
>>> 'Bangla'.lower()
'bangla'

এই একই কাজ কিন্তু আমরা casefold() ফাংশন দিয়েও করতে পারি।

>>> 'BANGLA'.casefold()
'bangla'
>>> 'Bangla'.casefold()
'bangla'

তবে lower() আর casefold() এর ভিতরে ব্যবহারগত পার্থক্য আছে। lower() ব্যবহার করা হয় স্ট্রিং ডিসপ্লে করার কাজে। আর casefold() ব্যবহার করা হয় দুইটা স্ট্রিং কমপেয়ার করার সময় যখন তাদের কেস এক হওয়রা দরকার হয়। ভবিষ্যতে আমরা casefold() এর একটা ব্যবহার দেখব।

যদি কখনো দরকার হয় যে বড় হাতেরকে ছোট হাতের করতে হবে আর ছোট হাতেরকে বড় হাতের করতে হবে তখন আমরা swapcase() ফাংশন ব্যবহার করব।

>>> 'Bangla'.swapcase()
'bANGLA'

স্ট্রিং গণনা, স্ট্রিং খোঁজা

স্ট্রিং তো নানারকম ক্যারেক্টারের সমষ্টি, আমরা তো জানি। আমরা ইনডেক্স অনুসারে স্ট্রিং থেকে বিভিন্ন ক্যারেক্টারকেও অ্যাক্সেস করতে পারি। কিন্তু একটা স্ট্রিংয়ে কতগুলো ক্যারেক্টার রয়েছে তা কিভাবে জানা সম্ভব? এইজন্য রয়েছে len() ফাংশন। এই ফাংশনের কাজ হল লেংথ আউটপুট দেয়া বা রিটার্ন করা। এই ফাংশনের ভিতর স্ট্রিং, লিস্ট, টাপল, ডিকশনারি যাই দেব, সে আমাদের সেই জিনিসের লেংথ বলে দেবে। মজার জিনিস!

>>> a
'bangla'
>>> len(a)
6

হুম, আমরা a ভ্যারিয়েবলে ৬ ক্যারেক্টারের একটা স্ট্রিং অ্যাসাইন করেছিলাম। এখন একটা জিনিস সবাই একটু খেয়াল করি, 'bangla' তে a কিন্তু দুইবার আছে। পাইথন দিয়ে কিভাবে এটা হিসাব করা যায়? খুবই সহজ। এইজন্য আমরা count() ফাংশন ব্যবহার করব।

>>> a
'bangla'
>>> a.count('a')
2

হয়ত ঠিকভাবে বোঝা গেল না। আমরা আরেকটা উদাহরণ দেখব। তার আগে বলে নিই, count() ফাংশনটা ভীষণ স্মার্ট। এটা নিয়ে ফাংশন চাপ্টারে আমরা আরো কিছু বলব।

>>> sentence = 'How can a clam cram in a clean cream can?'
>>> sentence.count('c')
6
>>> sentence.count('c', 5)
5
>>> sentence.count('c', 5, 9)
0

প্রথম স্টেটমেন্টে আমরা sentence ভ্যারিয়েবলে একটা চমৎকার বাক্য (স্ট্রিং) অ্যাসাইন করেছি। এই স্ট্রিংয়ে বেশ কয়েকটা c ক্যারেক্টার আছে। মাঝের স্টেটমেন্টে আমরা সেটাই হিসেব করেছি। ৩য় স্টেটমেন্টে আমরা দেখেছি যে 5 নাম্বার ইনডেক্স থেকে শেষ পর্যন্ত হিসাব করলে কয়টা c পাওয়া যায়। আর শেষ স্টেটমেন্টে আমরা দেখেছি যে 5 নাম্বার ইনডেক্স থেকে শুরু করে 9 নম্বর ইনডেক্স পর্যন্ত কয়টা c আছে। ব্যাপারটা জটিল লাগতে পারে। বেশি প্রেসার নেয়ার দরকার নাই। কারণ, ফাংশন চাপ্টারে আবার কথা হবে তো এটা নিয়ে। মন খারাপ করার কি আছে!

এবার আরেকটা মজার জিনিস দেখি। আমাদের এই বাক্যে কোন কোন ইনডেক্সে c রয়েছে তা কিভাবে খুঁজে বের করব? এইজন্য আমরা find() ফাংশন ব্যবহার করব।

>>> sentence = 'How can a clam cram in a clean cream can?'
>>> sentence.find('c')
4

আমরা আউটপুট পেলাম 4। কিন্তু আমাদের কিন্তু বেশ কয়েকটা আউটপুট পাবার কথা। তাহলে ভুলটা কোথায়? আসলে ভুল না। এই ফাংশনের ব্যাপার হল প্রথম যে ইনডেক্সে কাঙ্ক্ষিত ক্যারেক্টার খুঁজে পাবে সেটাই আউটপুট হিসাবে দেখাবে বা রিটার্ন করবে আমাদের কাছে। আচ্ছা, 4 নাম্বার ইনডেক্সে তো একটা c পেলাম। এবার 5 নাম্বার থেকে আবার খোঁজাখুঁজি শুরু করা যাক।

>>> sentence.find('c', 5)
10

২য় c টা আমরা 10 নাম্বার ইনডেক্সে পেলাম। একই কাজের জন্য আমরা index() ফাংশনটাও ব্যবহার করতে পারি। find() আর index() ফাংশনের ভিতর ব্যবহারগত দিক থেকে তেমন কোন পার্থক্য নেই। পার্থক্য হল স্মার্টনেসে - কাঙ্ক্ষিত স্ট্রিং খুঁজে না পেলে find() ফাংশন -1 রিটার্ন করে আর index() ফাংশন ValueError: substring not found এরর মেসেজ থ্রো করে।

কাটাকুটি, ফাটাফাটি

'How can a clam cram in a clean cream can?' এই স্ট্রিংটা আবার বিবেচনা করা যাক। হঠাৎ মন চাইল যে আমরা এর সবগুলো c কে d দিয়ে পরিবর্তন করে ফেলব, মানে c এর জায়গায় d বসাব আর কি! কিভাবে করব? হুম কঠিন সমস্যা। তবে এই কঠিন সমস্যার সমাধানটাও নিতান্তই সহজ। replace() ফাংশন ব্যবহার করে আমরা সহজেই তা করতে পারি। ফাংশনটার ভিতরে প্রথমে যে ক্যারেক্টারটাকে রিপ্লেস করব সেটাকে দেব, তারপরে যাকে দিয়ে রিপ্লেস করব তাকে দেব। নিচের প্রোগ্রামটা দেখলে সব পরিষ্কার হয়ে যাবে:

>>> sentence = 'How can a clam cram in a clean cream can?'
>>> sentence.replace('c', 'd')
'How dan a dlam dram in a dlean dream dan?'

আশা করি সবাই বুঝেছি। এবার আমরা ? কে নাই করে দেব। মানে যে জায়গায় ? ক্যারেক্টারটা আছে, সেখান থেকে ভ্যানিশ করে দেব।

>>> sentence = 'How can a clam cram in a clean cream can?'
>>> sentence.replace('?', '')
'How can a clam cram in a clean cream can'

এই কাজটা আমরা আরো সহজে করতে পারি strip() ফাংশন দিয়ে।

>>> sentence = 'How can a clam cram in a clean cream can?'
>>> sentence.strip('?')
'How can a clam cram in a clean cream can'

আশা করি সবাই বুঝতে পেরেছি। এবার আরেকটা জিনিস শিখব। এই যে আমাদের স্ট্রিংটা আছে, এটার ভিতর অনেকগুলো হোয়াইটস্পেস আছে। আমরা এই হোয়াইটস্পেসগুলোর উপর ভিত্তি করে স্ট্রিংটাকে ভাগ করব।

>>> sentence = 'How can a clam cram in a clean cream can?'
>>> sentence.split(' ')
['How', 'can', 'a', 'clam', 'cram', 'in', 'a', 'clean', 'cream', 'can?']

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

সহজ ভাষায় পাইথন ৩

বইটি পড়ার সময় প্রতিটি টপিক ধারাবাহিকভাবে বুঝে বুঝে পড়তে হবে এবং হাতে-কলমে অনুশীলন করতে হবে। কোন অংশ বুঝতে সমস্যা হলে ফেসবুক গ্রুপ পাইথন বাংলাদেশে সমস্যাটি পোস্ট করতে পারেন। এখান থেকে অতি দ্রুত সাহায্য-সহযোগীতা পাবেন আপনি।

results matching ""

    No results matching ""