ভেরিয়েবল, ডেটা টাইপ ও ডেটা ইনপুট #
ভেরিয়েবল #
চলুন, সবাই মিলে ছেলেবেলায় ফিরে যাই। সেই দিনগুলোর কথা কি মনে আছে, যখন আমরা নতুন নতুন বীজগণিত শিখেছিলাম? না, সেই দিনগুলো ভোলার নয়। আজ আবার সেই বীজগণিতের একটা অঙ্ক (ম্যাথ) করা যাক।
যদি a = 5 হয় ও b = 10 হয় তবে ab = ?
দেওয়া আছে, a = 5 এবং b = 10
অতএব, ab = 5 * 10 = 50
যদি জিজ্ঞেস করা হয় আমাদের, যে এখানে a ও b আসলে কী? তাহলে আমরা সবাই চিৎকার করে বলে উঠব, এরা হলো চলক। আমরা কমবেশি সবাই চলক সম্পর্কে ধারণা রাখি। এই চলককেই ইংরেজিতে ভেরিয়েবল বলে।
ভেরিয়েবল হলো অনেকটা বাক্সের মতো। বাক্সে যেমন পানি রাখা যায়, জিনিসপাতি রাখা যায়, তেমনি করে ভেরিয়েবলেও অনেক কিছু (ভ্যালু) রাখা যায়। ভেরিয়েবল ও এর মানের মাঝখানে ইক্যুয়াল (=
) চিহ্ন থাকে। এই চিহ্নের বামপাশে থাকে ভেরিয়েবল আর ডানপাশে থাকে ভ্যালু। ডানপাশে যে ভ্যালু দেওয়া হয় তা বামপাশের ভেরিয়েবলে স্টোর হয়ে যায়, একে অ্যাসাইনমেন্ট বলে। তবে আদতে স্টোরটা হয় কম্পিউটার মেমোরিতে। প্রতিটি ভেরিয়েবলের মেমোরি অ্যাড্রেস ভিন্ন বা ইউনিক হয়।
>>> x = 5
>>> x
5
>>> x = 12
>>> x
12
>>> x = 10.34
>>> x
10.34
>>> x = 'Python'
>>> x
'Python'
ওপরে আমরা x-এর ভেতরে বিভিন্ন স্টেটমেন্টে বিভিন্ন জিনিস স্টোর করেছি। যখন নতুন একটা ভ্যালু দিয়েছি, তখনই আগের ভ্যালুটা রিপ্লেস হয়ে গেছে। একে রি-অ্যাসাইনমেন্ট বলে।
পাইথনে ভেরিয়েবল লেখার কিছু নিয়মকানুন আছে। একটা ভেরিয়েবল A থেকে Z পর্যন্ত যেকোনো বড় হাতের অক্ষর অথবা a থেকে z পর্যন্ত যেকোনো ছোট হাতের অক্ষর অথবা আন্ডারস্কোর চিহ্ন (_
) দিয়ে শুরু হতে পারবে। এরপরে যেকোনো লেটার, ডিজিট (0 থেকে 9 পর্যন্ত) বা আন্ডারস্কোর ব্যবহার করতে পারব আমরা। তবে @
বা $
বা %
-এর মতো কিছু চিহ্ন ব্যবহার করা যাবে না। আরেকটা রেস্ট্রিকশন হলো, পাইথনের রিজার্ভড কি-ওয়ার্ডগুলোও ব্যবহার করতে পারব না। এখানে পাইথনের রিজার্ভড কি-ওয়ার্ডগুলো (পাইথনের অফিসিয়াল ডকুমেন্টেশন থেকে প্রাপ্ত) একটা টেবিলে সাজিয়ে দিলাম। মুখস্থ করার কোনো দরকার নেই। আস্তে আস্তে এমনিতেই মাথায় গেঁথে যাবে।
কী-ওয়ার্ড | কী-ওয়ার্ড | কী-ওয়ার্ড |
---|---|---|
False | None | True |
and | exec | not |
as | finally | or |
assert | for | pass |
break | from | |
class | global | raise |
continue | if | return |
def | import | try |
del | in | while |
elif | is | with |
else | lambda | yield |
except |
পাইথনে ভেরিয়েবল বা যেকোনো আইডেন্টিফায়ার কিন্তু কেস সেনসিটিভ (পাইথন কেস সেনসিটিভ ল্যাঙ্গুয়েজ)। মানে পাইথনে ছোট হাতের a আর বড় হাতের A এক জিনিস নয়, একেবারেই ভিন্ন জিনিস।
ডেটা টাইপ #
আগের উদাহরণে ফিরে আসি, সেখানে a = 5 দিয়ে বোঝানো হয়, a এর ভেতরে 5 আছে। যেহেতু 5 হলো পূর্ণসংখ্যা, সে জন্য a হলো একটি পূর্ণসংখ্যার ভেরিয়েবল অথবা প্রোগ্রামিংয়ের ভাষায় ইন্টিজার টাইপ ভেরিয়েবল। ইন্টিজারের বাংলা হলো পূর্ণসংখ্যা। এখন যদি বলা হয়, a = 3.1416 তাহলে a কোন টাইপের ভেরিয়েবল? যদি আমরা সবাই বলে থাকি যে a হলো দশমিক বা ফ্লোট টাইপের ভেরিয়েবল, তাহলে বুঝেছি ব্যাপারটা। এখন ওপরের অঙ্কটা আমরা পাইথনে করব :
>>> a = 5
>>> b = 10
>>> a*b
50
একই উত্তর দেখাচ্ছে। ইতিমধ্যে আমরা print() মেশিন বা ফাংশনটা সম্পর্কে জেনেছি। এখন আমরা আরেকটা ফাংশন সম্পর্কে জানব। আমাদের নতুন ফাংশনটা হলো type(); এই ফাংশনের মধ্যে কোনো ভেরিয়েবলকে দিয়ে দিলে সেটা কোন টাইপের, তা জানা যায়। চলুন দেখা যাক -
>>> a = 5
>>> type(a)
<class 'int'>
>>> b = 10
>>> type(b)
<class 'int'>
>>> type(a*b)
<class 'int'>
আমরা দেখতে পাচ্ছি, type(a)
স্টেটমেন্ট চালিয়ে আমরা আউটপুট পেয়েছি <class 'int'>
, এই আউটপুটটা পুরোপুরি বোঝার কোনো দরকার আপাতত নেই। আমরা শুধু int
কথাটার ওপর জোর দেব। এই int
মানে হলো ইন্টিজার। এখন আমরা একনজরে পাইথনের কমন ডেটা টাইপগুলো দেখব -
True
অথবা False
হয়। সোজা কথায়, বুলিয়ান টাইপের ভেরিয়েবল দিয়ে সত্য-মিথ্যা প্রকাশ করা হয়।চলুন, এবার এদের কয়েকটা উদাহরণ দেখা যাক -
>>> a = 1
>>> type(a)
<class 'int'>
>>> b = 3.1416
>>> type(b)
<class 'float'>
>>> c = "Hello World!"
>>> type(c)
<class 'str'>
>>> d = True
>>> type(d)
<class 'bool'>
সাধারণত আমরা এই চার ধরনের ডেটা টাইপই বেশি ব্যবহার করব। তবে এগুলো বাদেও long, complex, unicode, list, tuple, set, dict ইত্যাদি নানা ধরনের ডেটা টাইপের ব্যবহার রয়েছে পাইথনে।
ডেটা ইনপুট #
ওপরে আমরা একটা অঙ্ক করেছি। সেখানে বলাই ছিল a এর মান 5 আর b এর মান 10 হওয়ায়, খুব সহজেই আমরা ম্যাথটি করে ফেলতে পেরেছি। এখন যদি বলা হয় যে ইউজার নিজে ডেটা দিতে পারবে, তখন কী হবে? মানে, ইউজার বিভিন্ন সময় বিভিন্ন ডেটা দেবে আর পাইথনের সাহায্যে আমরা প্রতিবার তাদের গুণফল আউটপুট দেব। বেশ চিন্তার কথা!
এ জন্য আমরা নতুন একটা ফাংশনের কাজ শিখব। এই নতুন ফাংশনটা হলো— input()
এই ফাংশনটার কাজ হলো ইউজারের কাছ থেকে ডেটা নিয়ে কোনো ভেরিয়েবলে সংরক্ষণ করা। উদাহরণ হিসেবে দেখানো যায় -
>>> a = input()
10
>>> a
'10'
এখানে ইউজারের থেকে ডেটা নিয়ে a ভেরিয়েবলের ভেতরে সংরক্ষণ করা হয়েছে। পরে আমরা a-এর আউটপুট চেক করে দেখেছি। এখন ওপরের অঙ্কটা আবার করা যাক। তবে এবার ডেটা সাপ্লাই দেবে ইউজার।
>>> a = input()
10
>>> b = input()
40
>>> a*b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'str'
>>>
রেজাল্ট আসার কথা 400 কিন্তু সেখানে কতগুলো হাবিজাবি জিনিস এসেছে। এই হাবিজাবি জিনিসগুলোর ময়নাতদন্ত করা যাক।
আসলে পাইথন এখানে একটা এরর থ্রো করেছে। যখন পাইথন ইন্টারপ্রিটার প্রোগ্রামে কোনো ভুল বা সমস্যা খুঁজে পায়, তখন সমস্যার ধরন অনুসারে বিভিন্ন এরর থ্রো করে। আমাদের এখানে যে এরর থ্রো করেছে, সেটা হলো TypeError
; যখন টাইপে সমস্যা থাকে, তখন এই TypeError
থ্রো করা হয়।
চলুন, এরর মেসেজটা একটু খেয়াল করে দেখা যাক। can't multiply sequence by non-int of type 'str'
এই লাইনটা দিয়ে কী বোঝানো হয়েছে? সহজ কথায়, দুটি স্ট্রিং টাইপের ভেরিয়েবলকে গুণ করা সম্ভব না। কিন্তু ইউজার তো ইন্টিজার ডেটা ইনপুট দিয়েছে। তাহলে সমস্যা কোথায়? আরও একটু ময়নাতদন্ত করি:
>>> a = input()
10
>>> type(a)
<class 'str'>
>>> b = input()
40
>>> type(b)
<class 'str'>
>>> a*b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'str'
কী দেখতে পাচ্ছি আমরা? চমৎকার জিনিস! ডেটা ইনপুট দিলাম ইন্টিজার আর ভেরিয়েবলের মধ্যে ঢুকল স্ট্রিং। তাহলে উপায়?
টাইপ কাস্টিং বা টাইপ কনভারশন #
পাইথনে টাইপ কাস্টিং বলে একটা মজার জিনিস আছে। আসলে সব প্রোগ্রামিং ল্যাঙ্গুয়েজেই এই ফিচারটা রয়েছে। এর সাহায্যে এক টাইপের ভেরিয়েবলকে অন্য টাইপে কাস্ট করা হয়। কাস্ট করা হয় মানে ওই টাইপের দেখানো হয়, আসলে ভেরিয়েবল যা ছিল তা-ই থাকে। আর এই টাইপ কাস্টিং করা হয় কতগুলো ফাংশনের সাহায্যে (আসলে ফাংশন না ক্লাস বলাই ভালো); একনজরে আমরা দরকারি ফাংশনগুলো দেখব -
ফাংশন | বর্ননা |
---|---|
int() | ইন্টিজারে কাস্ট করে |
float() | ফ্লোটে কাস্ট করে |
str() | স্ট্রিংয়ে কাস্ট করে |
tuple() | টাপলে কাস্ট করে |
list() | লিস্টে কাস্ট করে |
set() | সেটে কাস্ট করে |
dict() | ডিকশনারিতে কাস্ট করে |
এবার একটা উদাহরণ দেখা যাক।
>>> a = 5
>>> type(a)
<class 'int'>
>>> a = str(a)
>>> type(a)
<class 'str'>
আমরা প্রথমে a ভেরিয়েবলে 5 ইন্টিজার ভ্যালু অ্যাসাইন করেছি। অ্যাসাইন করা মানে ভ্যালু বা ডেটা রাখা। তারপর a-এর টাইপ চেক করে দেখেছি এটি int টাইপের। এরপর আমরা a কে str()
ফাংশনের মধ্যে চালান করে দিয়ে a-কে স্ট্রিং হিসেবে কাস্ট করেছি। শুধু কাস্ট করেই ক্ষান্ত থাকিনি, কাস্ট করার পর সেই ভ্যালুকে আবার a-এর মধ্যেই অ্যাসাইন করেছি। সবশেষে আবার a-এর টাইপ চেক করে দেখেছি এবার টাইপ str; সুতরাং আমরা টাইপ কাস্টিং বুঝতে পারলাম। এবার আমাদের অঙ্কটা আবার করি:
>>> a = input()
10
>>> a = int(a)
>>> b = input()
40
>>> b = int(b)
>>> a*b
400
এবার আমরা আমাদের কাঙ্ক্ষিত আউটপুট পেয়েছি। এটাকে আরও সহজ করে লেখা যায়:
>>> a = int(input())
10
>>> b = int(input())
40
>>> a*b
400
এতে করে আমাদের প্রোগ্রামটা আরও ছোট হয়ে গেল। আসলে আমরা ইনপুট আর কাস্টিংকে একটা স্টেটমেন্টেই করে ফেলেছি। আমরা চাইলে a আর b-এর মান দুই লাইনে ইনপুট না নিয়ে কিন্তু এক লাইনেও নিতে পারতাম। কীভাবে নিতে পারতাম? সে ক্ষেত্রে আমাদের দুটি কাজ করতে হবে। এক হলো, ইনপুট ডেটাগুলোর মধ্যে স্পেস দিয়ে আলাদা করতে হবে আর দুই হলো, split()
ফাংশন ব্যবহার করতে হবে।
উদাহরণ দিলে পরিষ্কার হয়ে যাবে -
>>> a, b = input().split()
10 40
>>> a
'10'
>>> b
'40'
আমাদের পাইথন শেখার একপর্যায়ে আমরা বিভিন্ন অনলাইন জাজের প্রবলেম সলভ করব। সেখানে আমাদের এক লাইনে অনেকগুলো ডেটা ইনপুট নেওয়া লাগতে পারে। তাই আমরা আগেই এটা শিখে রাখলাম।
আচ্ছা, শেষের উদাহরণে যে a ও b-এর ভ্যালু নিলাম তাদের টাইপ কী? এভাবে ডেটা ইনপুট নিয়ে অঙ্কটা কি করতে পারা যাবে? কী মনে হয়? কালিদাস পণ্ডিত অভিশাপ দিয়ে গেছে, ‘এই পুরো বই পড়ার পরেও যে এই প্রশ্নের উত্তর দিতে পারবে না, সে চিরজীবন চিলেকোঠায় ভূত হয়ে থাকবে।’ চেষ্টা শুরু করুন, তাহলে!