সিদ্ধান্ত নেওয়া — if, elif, else
শর্ত দেখে আলাদা পথে যাওয়া, ইনডেন্টেশন কেন পাইথনে অর্থ বহন করে, আর শর্তের ক্রম ভুল হলে যে নীরব বাগটা তৈরি হয়।
কীভাবে শিখতে চান?
যে সমস্যাটা আমরা সমাধান করছি
আগের অধ্যায়ে আমরা প্রশ্ন করা শিখেছি — age >= 18 সত্য না মিথ্যা। কিন্তু উত্তর জেনে প্রোগ্রাম কিছুই করছিল না, শুধু True বা False ছেপে দিচ্ছিল।
এখন সেই উত্তরটা কাজে লাগানোর সময়। শর্ত সত্য হলে এক পথ, মিথ্যা হলে আরেক পথ। এটাই প্রোগ্রামিংয়ের সেই মুহূর্ত যেখানে কোড আর সরল তালিকা থাকে না — সে সিদ্ধান্ত নিতে শুরু করে।
আর পাইথনে একটা জিনিস অন্য অনেক প্রোগ্রামিং ভাষার চেয়ে আলাদা: কোন লাইনগুলো শর্তের ভেতরে আর কোনগুলো বাইরে, সেটা ঠিক হয় ফাঁকা জায়গা দিয়ে। কার্লি ব্র্যাকেট {} নেই। প্রথমে অস্বস্তি লাগে, তারপর ভালো লাগতে শুরু করে — কারণ যে কোডটা দেখতে গোছানো, সেটাই আসলে গোছানো।
এই অধ্যায় শেষে আপনি পারবেন
ifদিয়ে শর্তসাপেক্ষে কোড চালাতেelseদিয়ে বিকল্প পথ দিতে, আরelifদিয়ে একাধিক পথ- ইনডেন্টেশন ঠিকভাবে লিখতে, আর
IndentationErrorপড়ে সমাধান করতে - শর্তের ক্রম কেন গুরুত্বপূর্ণ তা বুঝতে — এখানেই সবচেয়ে বড় ফাঁদ
- শর্তের ভেতরে আরেকটা শর্ত বসাতে, আর কখন সেটা এড়াতে হবে তা বুঝতে
আগে যা জানা লাগবে: True আর False — প্রশ্ন করা শেখা।
সবচেয়ে সহজ রূপ
age = 22
if age >= 18:
print("You may enter")
print("Program finished")You may enter
Program finishedগঠনটা তিনটা অংশে ভাগ করা যায়:
ifশব্দটি, তারপর একটা শর্ত- শর্তের শেষে একটা কোলন
:— এটা বাদ পড়াই সবচেয়ে সাধারণ ভুল - পরের লাইনগুলো চার স্পেস ভেতরে — এই ভেতরে থাকা লাইনগুলোই শর্তের অধীনে
age যদি 15 হত, প্রথম print চলত না, কিন্তু শেষ print ঠিকই চলত — কারণ সেটা শর্তের বাইরে।
ইনডেন্টেশনই অর্থ
এই দুটো প্রোগ্রামে অক্ষরগুলো প্রায় একই, কিন্তু কাজ সম্পূর্ণ আলাদা:
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")এই প্রোগ্রামটি চালালে টার্মিনালে কিছুই আসে না — দুটো লাইনই শর্তের ভেতরে, আর শর্তটা মিথ্যা।
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")Certificate issuedদ্বিতীয় print-টা এখন শর্তের বাইরে, তাই সে সব সময় চলে — এমনকি যে ফেল করেছে তার নামেও সার্টিফিকেট ছাপা হয়ে গেল। এক লাইনের ইনডেন্টেশন ভুল হলে ব্যবসার নিয়মটাই ভেঙে যায়, আর পাইথন কোনো এরর দেয় না — দুটোই বৈধ কোড।
চার স্পেস, ট্যাব নয়। পাইথন দুটোই মানে, কিন্তু একই ফাইলে দুটো মিশিয়ে ফেললে TabError আসে, আর সেটা খুঁজে বের করা কষ্টকর কারণ চোখে ট্যাব আর স্পেস একই রকম দেখায়। ১ নম্বর অধ্যায়ে যে VS Code ইনস্টল করেছেন, সেখানে পাইথন ফাইলে Tab চাপলে চার স্পেস বসে — এটা ওর ডিফল্ট সেটিং, আর চার স্পেসই পাইথনের অফিসিয়াল রীতি।else — অন্য পথ
age = 15
if age >= 18:
print("You may enter")
else:
print("Sorry, adults only")Sorry, adults onlyelse-এর সাথে কোনো শর্ত থাকে না, কারণ তার শর্তটা আগেই বলা হয়ে গেছে — “উপরের কোনোটাই সত্য না হলে”। if আর else-এর মধ্যে ঠিক একটা চলবে, কখনো দুটো নয়, কখনো শূন্যটাও নয়।
elif — একাধিক পথ
marks = 72
if marks >= 80:
grade = "A"
elif marks >= 70:
grade = "B"
elif marks >= 60:
grade = "C"
elif marks >= 40:
grade = "D"
else:
grade = "F"
print(f"Marks {marks} gives grade {grade}")Marks 72 gives grade Belif মানে “নাহলে যদি”। এখানে যা ঘটে তা হলো — পাইথন উপর থেকে নিচে যায়, প্রথম যে শর্তটা সত্য পায় সেটার কাজ করে, তারপর পুরো চেইনটা ছেড়ে বেরিয়ে যায়। বাকি শর্তগুলো পরীক্ষা করেও দেখে না।
marks = 72 হলে: 72 >= 80 মিথ্যা, 72 >= 70 সত্য → grade = "B", আর শেষ। 72 >= 60 আর 72 >= 40 সত্য হলেও সেগুলো আর দেখাই হয় না।
এখানেই সবচেয়ে বড় ফাঁদ
elif “প্রথম সত্যটাতেই থামে” — এই একটা কথার ফল হলো, শর্তের ক্রম ভুল হলে প্রোগ্রাম চলে, এরর দেয় না, শুধু ভুল উত্তর দেয়:
marks = 95
if marks >= 40:
grade = "Pass"
elif marks >= 80:
grade = "Excellent"
else:
grade = "Fail"
print(grade)Pass৯৫ পেয়েও Excellent আসেনি। কারণ 95 >= 40 প্রথমেই সত্য হয়ে গেছে, আর পাইথন সেখানেই থেমে গেছে — দ্বিতীয় শর্তটা কখনো পরীক্ষা করাই হয়নি।
নিয়মটা মনে রাখুন: সবচেয়ে কঠিন বা সবচেয়ে নির্দিষ্ট শর্তটা আগে লিখুন, সবচেয়ে ঢিলেটা শেষে। সংখ্যার সীমা নিয়ে কাজ করলে বড় থেকে ছোটর দিকে নামুন, যেমন উপরের গ্রেডের উদাহরণে।
এই বাগটা এতই নীরব যে চোখে দেখা ছাড়া ধরার উপায় নেই। তাই শর্তের চেইন লেখার পর অভ্যাস করুন — প্রতিটা ধাপের জন্য একটা করে মান দিয়ে চালিয়ে দেখা। উপরের গ্রেডের কোডটা 95, 72, 65, 45 আর 20 — পাঁচটা মান দিয়ে চালালে পাঁচটা আলাদা উত্তর আসা উচিত। একটাও না মিললে ক্রমে সমস্যা।
শর্তের ভেতরে শর্ত
is_logged_in = True
is_admin = False
if is_logged_in:
if is_admin:
print("Welcome, admin")
else:
print("Welcome, user")
else:
print("Please log in")Welcome, userভেতরের if-টা চার স্পেস ভেতরে, কারণ সে বাইরের if-এর অধীনে, আর তার নিজের print লাইনগুলো আট স্পেস ভেতরে। এটা কাজ করে, কিন্তু ধাপ যত বাড়ে কোড পড়া তত কঠিন হয়। অনেক সময় and দিয়ে সমান কথা আরও পরিষ্কারভাবে বলা যায়:
is_logged_in = True
is_admin = False
if is_logged_in and is_admin:
print("Welcome, admin")
elif is_logged_in:
print("Welcome, user")
else:
print("Please log in")Welcome, userদুটোর কোনটা ভালো তা নির্ভর করে কোনটা পড়তে সহজ লাগে তার উপর। তিন ধাপের বেশি ভেতরে ঢুকে গেলে থামুন আর নতুন করে ভাবুন — সেটা প্রায় সব সময়ই ইঙ্গিত যে শর্তগুলো অন্যভাবে সাজানো যায়।
ইনপুট যাচাই করা
এখন আমাদের হাতে সেই হাতিয়ারটা আছে, যা দিয়ে আগের অধ্যায়ের ঝুলে থাকা সমস্যাটার সমাধান করা যায় — ইউজার কিছুই না লিখলে বা শব্দ লিখলে কী হবে:
raw = input("Your age: ").strip()
if raw == "":
print("You did not type anything")
elif raw.isdigit():
age = int(raw)
if age >= 18:
print(f"Age {age}: you may enter")
else:
print(f"Age {age}: adults only")
else:
print(f"'{raw}' is not a whole number")Your age: twenty
'twenty' is not a whole numberisdigit() একটা নতুন মেথড — স্ট্রিংয়ের সব অক্ষর অঙ্ক কি না বলে। এটাই int()-এ পাঠানোর আগে যাচাই করার সহজ উপায়, আর এতে ValueError আর আসে না। (isdigit() ঋণাত্মক সংখ্যা বা দশমিক মানে না — সেগুলোর জন্য পরে try শেখা লাগবে।)
একটা সম্পূর্ণ উদাহরণ
fare.py:
# Work out a ticket fare from age and day of week
age = int(input("Passenger age : "))
day = input("Day of week : ").strip().lower()
base_fare = 120.0
# Most specific rule first, loosest last
if age < 5:
fare = 0.0
category = "Infant"
elif age < 18:
fare = base_fare * 0.5
category = "Child"
elif age >= 60:
fare = base_fare * 0.7
category = "Senior"
else:
fare = base_fare
category = "Adult"
is_weekend = day == "saturday" or day == "sunday"
if is_weekend:
fare = fare * 1.2
print()
print(f"Category : {category}")
print(f"Weekend : {is_weekend}")
print(f"Fare : {fare:.2f}")Passenger age : 65
Day of week : Sunday
Category : Senior
Weekend : True
Fare : 100.80দুটো নকশার সিদ্ধান্ত লক্ষ্য করুন। এক, বয়সের শর্তগুলো elif দিয়ে জোড়া, কারণ একজন যাত্রী ঠিক একটা শ্রেণিতেই পড়বেন। দুই, সাপ্তাহিক ছুটির শর্তটা আলাদা if, কারণ সেটা স্বাধীন প্রশ্ন — বয়স যাই হোক, ছুটির দিনের বাড়তি ভাড়া আলাদাভাবে যোগ হয়। কোনটা elif আর কোনটা আলাদা if, এই সিদ্ধান্তটাই শর্ত লেখার আসল কাজ।
কিছু ভাঙা অবস্থা ও তার সমাধান
SyntaxError: expected ':' if, elif বা else-এর লাইনের শেষে কোলন দেওয়া হয়নি।
IndentationError: expected an indented block after 'if' statement if-এর পরের লাইনটা ভেতরে ঠেলা হয়নি। শর্তের ভেতরে অন্তত একটা লাইন থাকতে হবে।
IndentationError: unexpected indent কোনো লাইন অকারণে ভেতরে ঢুকে গেছে। ওই লাইনটা কোন ব্লকের অংশ, সেটা মিলিয়ে দেখুন।
TabError: inconsistent use of tabs and spaces in indentation একই ফাইলে ট্যাব আর স্পেস মেশানো হয়েছে। এডিটরে "convert indentation to spaces" চালিয়ে দিন।
SyntaxError — elif বা else একা দাঁড়িয়ে আছে elif আর else সব সময় একটা if-এর সাথে থাকে, আর তার ইনডেন্টেশন ওই if-এর সমান হতে হয়।
TypeError: '>=' not supported between instances of 'str' and 'int' input()-এর ভ্যালু বদলাতে ভুলে গেছেন। int(input(...)) লিখুন।
শর্ত ঠিক লাগছে কিন্তু ভুল পথে যাচ্ছে ক্রম দেখুন। ঢিলে শর্ত আগে থাকলে কঠিন শর্তটা কখনো পরীক্ষাই হয় না। প্রতিটা শাখার জন্য একটা করে মান দিয়ে চালিয়ে দেখুন।
ধাপ ৪ / ৬ — অনুমান
যাচাই করুন
৮৫ নম্বর নিয়ে এই প্রোগ্রামটা কী প্রিন্ট করবে?
marks = 85
if marks >= 40:
print("Pass")
elif marks >= 80:
print("Excellent")
else:
print("Fail")- AExcellent Pass
- BPass
- CPass Excellent
- DExcellent
এই প্রোগ্রামটা কী প্রিন্ট করবে?
score = 30
if score >= 50:
print("Passed")
print("Done")- APassed Done
- BDone
- Cকিছুই না
- DPassed
ইউজার 25 লিখলেও প্রোগ্রামটা TypeError দিয়ে থেমে যায়। কারণ কী, আর সমাধান কী?
age = input("Age: ")
if age >= 18:
print("Adult")
else:
print("Minor")- A`input()` স্ট্রিং দেয়, আর স্ট্রিংকে সংখ্যার সাথে এভাবে তুলনা করা যায় না — `age = int(input("Age: "))` লিখতে হবে
- B`else`-এর আগে একটা `elif` থাকা বাধ্যতামূলক
- C`if`-এর শর্তে `>=` ব্যবহার করা যায় না, `>` লিখতে হবে
- D`age` নামটা পাইথনের সংরক্ষিত শব্দ, তাই তুলনা কাজ করেনি
উত্তর দিতে অ্যাকাউন্ট লাগবে
উত্তর মিলিয়ে দেখতে সাইন ইন করুন
প্রশ্নগুলো উপরে আছে, আর মাথায় মাথায় উত্তর ভেবে নেওয়াই আসল কাজ। সঠিক উত্তর, ব্যাখ্যা আর তিন ধাপের ইঙ্গিত দেখতে সাইন ইন করুন।
নিজে করুন
bmi.py নামে একটা ফাইল লিখুন, যেটি উচ্চতা (মিটারে) আর ওজন (কেজিতে) নিয়ে BMI বের করে শ্রেণি জানায়।
সূত্র: bmi = weight / (height * height)
শ্রেণিগুলো:
- ১৮.৫-এর কম — Underweight
- ১৮.৫ বা তার বেশি, কিন্তু ২৫-এর কম — Normal
- ২৫ বা তার বেশি, কিন্তু ৩০-এর কম — Overweight
- ৩০ বা তার বেশি — Obese
সীমাগুলো ইচ্ছে করেই “কম” (<) আর “বা তার বেশি” (>=) দিয়ে লেখা। “১৮.৫ থেকে ২৪.৯” লিখলে মাঝখানে ফাঁক থেকে যায় — ২৪.৯৫-এর মতো BMI তাহলে কোনো শ্রেণিতেই পড়ে না। < আর >= দিয়ে লিখলে প্রতিটা সংখ্যা ঠিক একটা শ্রেণিতে পড়ে।
চারটা শর্ত:
- BMI দশমিকের পর এক ঘর পর্যন্ত দেখাবেন
- শর্তগুলো এমন ক্রমে লিখবেন যাতে চারটা শ্রেণিই সত্যিই কাজ করে
- উচ্চতা
0দিলে ভাগ করার আগেই থামিয়ে একটা বার্তা দেবেন — নাহলেZeroDivisionErrorআসবে - চারটা শ্রেণির জন্য চারটা আলাদা ভ্যালু দিয়ে চালিয়ে দেখবেন, আর সাথে সীমার ঠিক উপরের-নিচের ভ্যালুও — যেমন BMI ঠিক ২৫ হলে কোন শ্রেণিতে পড়ছে (উত্তর হওয়া উচিত Overweight)
চার নম্বর শর্তটাই সবচেয়ে জরুরি। সীমার ঠিক গায়ের ভ্যালুগুলোতেই শর্তের ক্রমের ভুল ধরা পড়ে।
এই মিশনে আরও কিছু আছে
উপরে যা পড়েছেন সেটাই সম্পূর্ণ মিশন — কিছু কেটে রাখা হয়নি। প্রো এর সাথে যোগ করে:
- ভেতরে আসলে কী ঘটে — পাইথন কীভাবে এটা চালায়
- অনুশীলনীর সম্পূর্ণ সমাধান, ধাপে ধাপে ব্যাখ্যাসহ
- কঠিন অতিরিক্ত অনুশীলনী
- এই বিষয়ে ইন্টারভিউতে যা জিজ্ঞেস করা হয়, আর তার আদর্শ উত্তর
ধাপ ৬ / ৬
কঠিন করা — অধ্যায়ের কুইজ
সহজ থেকে কঠিন — দশটি প্রশ্ন, শেষেরগুলো ইচ্ছে করেই কঠিন।
সাইন ইন করে কুইজ দিন