অধ্যায় 04

ভেরিয়েবল আর টাইপ — প্রোগ্রাম কীভাবে মনে রাখে

ভেরিয়েবলে মান রাখা, নাম দেওয়ার নিয়ম, আর চারটি মৌলিক টাইপ — int, float, str, bool। সাথে সেই ত্রুটি যেটা শুরুর দিকে সবচেয়ে বেশি আসে।

30 মিনিটPython 3.12
  1. 1সমস্যা
  2. 2বোঝা
  3. 3উদাহরণ
  4. 4অনুমান
  5. 5নিজে করা
  6. 6কঠিন করা

যে সমস্যাটা আমরা সমাধান করছি

এখন পর্যন্ত আমাদের প্রোগ্রামগুলো কিছুই মনে রাখতে পারত না। যা ছাপা হয়ে গেছে, চলে গেছে।

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

আর সাথে দ্বিতীয় সমস্যাটা — আগের মিশনে দেখেছেন "2" + "3" দিয়েছিল 23, কিন্তু 2 + 3 দিয়েছিল 5। একই চিহ্ন, দুই রকম আচরণ। কারণ পাইথনের চোখে ওই দুটো জিনিসের ধরন আলাদা। এই ধরনটাকেই বলে টাইপ, আর শুরুর দিকের ত্রুটির সবচেয়ে বড় অংশ এখান থেকেই আসে।

এই মিশন শেষে আপনি পারবেন

  • ভেরিয়েবলে মান রাখতে ও পরে সেটা বদলাতে
  • এমন নাম দিতে যেটা পাইথন মানবে, আর যেটা পড়ে মানুষ বুঝবে
  • চারটি মৌলিক টাইপ চিনতে: int, float, str, bool
  • type() দিয়ে যেকোনো মানের ধরন দেখে নিতে
  • TypeError পড়ে বুঝতে সমস্যাটা ঠিক কোথায়

আগে যা জানা লাগবে: print দিয়ে দেখা, কমেন্ট দিয়ে বোঝানো।


ভেরিয়েবল হলো একটা নাম

python
city_count = 4

এই লাইনটা পড়তে হবে ডান থেকে বামে: 4 মানটি তৈরি হলো, আর তার গায়ে city_count নামের একটা লেবেল লাগানো হলো। এখন থেকে city_count লিখলেই পাইথন ওই মানটা এনে দেবে।

python
city_count = 4
print("Cities:", city_count)
print("Double:", city_count * 2)
text
Cities: 4
Double: 8
= মানে সমান নয়। গণিতে x = 4 একটা দাবি — x এবং 4 সমান। পাইথনে = একটা আদেশ: "এই মানটা ওই নামে রাখো।" তাই total = total + 5 লাইনটা গণিতে অসম্ভব শোনালেও পাইথনে পুরোপুরি স্বাভাবিক — মানে হলো, "total-এর এখনকার মানের সাথে ৫ যোগ করে ফলটা আবার total-এ রাখো।" সমান কিনা সেটা যাচাই করার আলাদা চিহ্ন আছে, ==, যেটা আমরা পরে দেখব।

মান বদলানো

একটা ভেরিয়েবলে নতুন মান বসালে পুরনোটা আর থাকে না:

python
stock = 20
print("Before:", stock)

stock = stock - 3
print("After:", stock)
text
Before: 20
After: 17

একটা জিনিস মনে রাখা দরকার — মান কপি হয়ে যায়, লেবেল দুটো জোড়া লেগে থাকে না:

python
a = 10
b = a
a = 99
print(a, b)
text
99 10

b = a লাইনে b পেয়েছিল a-এর তখনকার মান, অর্থাৎ 10। পরে a বদলালেও b বদলায় না — b কখনো a-কে দেখছিল না, সে একটা মান পেয়েছিল।

নাম দেওয়ার নিয়ম

পাইথন যা মানবে না:

  • সংখ্যা দিয়ে শুরু: 2nd_price চলবে না, price_2 চলবে
  • মাঝে ড্যাশ: total-price চলবে না, পাইথন ওটাকে বিয়োগ ভাবে
  • মাঝে স্পেস: total price চলবে না
  • পাইথনের সংরক্ষিত শব্দ: class, for, if, import, return, None — এগুলো নাম হিসেবে ব্যবহার করা যায় না

যা মানবে, কিন্তু করা উচিত নয়:

python
x1 = 4500           # clear today, meaningless in three weeks
Total_Price = 4500  # legal Python, but not the Python convention
l = 4500            # lowercase L and the digit one look almost identical

পেশাদার পাইথনের রীতি হলো snake_case — ছোট হাতের অক্ষর, শব্দের মাঝে আন্ডারস্কোর:

python
total_price = 4500
customer_name = "Rafi"
items_in_cart = 3

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

চারটি মৌলিক টাইপ

python
items = 7        # int   — a whole number
price = 249.50   # float — a number with a decimal point
name = "Rafi"    # str   — text, inside quotes
is_paid = True   # bool  — only True or False

print(type(items))
print(type(price))
print(type(name))
print(type(is_paid))
text
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>

type() আপনার সন্দেহ মেটানোর যন্ত্র। কোনো ভেরিয়েবল অদ্ভুত আচরণ করলে প্রথম কাজ — তার টাইপটা ছেপে দেখুন। বেশিরভাগ সময় উত্তরটা ওখানেই পাওয়া যায়।

দুটো ছোট কিন্তু জরুরি কথা:

True আর False বড় হাতের অক্ষরে শুরু। true লিখলে পাইথন সেটাকে একটা ভেরিয়েবলের নাম ভাববে এবং বলবে সে ওই নাম চেনে না।

"7" আর 7 এক জিনিস নয়। প্রথমটা লেখা, দ্বিতীয়টা সংখ্যা। দেখতে একই রকম, কিন্তু পাইথনের কাছে সম্পূর্ণ আলাদা:

python
a = 7
b = "7"
print(type(a), type(b))
print(a * 3)
print(b * 3)
text
<class 'int'> <class 'str'>
21
777

সেই ত্রুটি, যেটা সবার আসে

python
age = "22"
print(age + 1)
text
Traceback (most recent call last):
  File "D:\python-lab\lesson-04\demo.py", line 2, in <module>
    print(age + 1)
          ~~~~^~~
TypeError: can only concatenate str (not "int") to str

বার্তাটা ভয় দেখানোর মতো দেখতে, কিন্তু এটা আসলে পরিষ্কার করে বলে দিচ্ছে: str-এর সাথে শুধু str জোড়া লাগানো যায়, int নয়। অর্থাৎ পাইথন বুঝতে পারছে না আপনি যোগ করতে চান নাকি জোড়া লাগাতে — তাই সে আন্দাজ করেনি, থেমে গেছে।

ত্রুটির বার্তা পড়ুন, নিচের লাইন থেকে উপরের দিকে। শেষ লাইনটা বলে কী সমস্যা, তার উপরের লাইনটা বলে কোথায়। শুরুর দিকে অনেকে ত্রুটি দেখলেই ঘাবড়ে গিয়ে পুরোটা এড়িয়ে যায়; কিন্তু পাইথনের ত্রুটি বার্তা আসলে সবচেয়ে সাহায্যকারী লেখা যা আপনি স্ক্রিনে পাবেন।

সমাধান — সংখ্যাটাকে সংখ্যা বানিয়ে নিন:

python
age = "22"
print(int(age) + 1)
text
23

int() লেখাকে পূর্ণ সংখ্যায় বদলে দেয়। এটা কখন কাজে লাগে আর কখন ভেঙে পড়ে, সেটা input() নিয়ে মিশনে বিস্তারিত আসবে — কারণ ওখানে এই সমস্যাটা প্রতিবার আসে।


একটা সম্পূর্ণ উদাহরণ

invoice.py:

python
# Invoice for a single order, all figures in one place
customer_name = "Rafi"
unit_price = 249.50
quantity = 3
is_member = True

subtotal = unit_price * quantity
discount = 50.0
total = subtotal - discount

print("Customer  :", customer_name)
print("Quantity  :", quantity)
print("Subtotal  :", subtotal)
print("Discount  :", discount)
print("Total     :", total)
print("Member    :", is_member)
text
Customer  : Rafi
Quantity  : 3
Subtotal  : 748.5
Discount  : 50.0
Total     : 698.5
Member    : True

এখানে আসল সুবিধাটা লক্ষ্য করুন: দাম বদলাতে হলে শুধু unit_price লাইনটা বদলাবেন, আর নিচের সব হিসাব নিজে থেকে ঠিক হয়ে যাবে। সংখ্যাগুলো সরাসরি print-এর ভেতরে লিখে ফেললে প্রতিবার প্রতিটি জায়গা খুঁজে বদলাতে হতো — আর একটা জায়গা বাদ পড়লেই রিপোর্ট ভুল।


কিছু ভাঙা অবস্থা ও তার সমাধান

NameError: name 'total' is not defined যে নামটা ব্যবহার করছেন, সেটায় এখনো কোনো মান রাখা হয়নি — নয়তো বানানে ভুল আছে। পাইথন total আর totl কে দুটো আলাদা নাম হিসেবেই দেখে। খেয়াল রাখুন, ছোট-বড় হাতের অক্ষরও আলাদা: Total আর total এক নয়।

TypeError: can only concatenate str (not "int") to str লেখার সাথে সংখ্যা জোড়া লাগাতে চেয়েছেন। হয় int() দিয়ে লেখাকে সংখ্যা বানান, নয়তো print("Age:", age) এভাবে কমা দিয়ে দিন — কমা দিলে print নিজেই সব ধরন সামলে নেয়।

SyntaxError: invalid syntax — নামে ড্যাশ আছে total-price = 5 লাইনে পাইথন total থেকে price বিয়োগ করার চেষ্টা দেখে। আন্ডারস্কোর দিন: total_price।

SyntaxError: cannot assign to keyword আপনি পাইথনের সংরক্ষিত শব্দকে নাম বানাতে চেয়েছেন, যেমন class = 10। অন্য নাম দিন: class_name, grade।

NameError: name 'true' is not defined True আর False বড় হাতের অক্ষরে শুরু হয়।