True আর False — প্রশ্ন করা শেখা
তুলনার অপারেটর, and / or / not, চেইন করা তুলনা, আর কোন ভ্যালুগুলো পাইথনের চোখে মিথ্যা — শর্ত লেখার আগে যে ভিতটা লাগে।
কীভাবে শিখতে চান?
যে সমস্যাটা আমরা সমাধান করছি
একটা প্রোগ্রামকে সিদ্ধান্ত নিতে হবে: এই অর্ডারে ছাড় দেওয়া যাবে কি? পাসওয়ার্ডটা যথেষ্ট লম্বা কি? স্টকে মাল আছে কি?
সিদ্ধান্ত নেওয়ার কোডটা আসবে পরের অধ্যায়ে (if)। কিন্তু তার আগে দরকার সেই জিনিসটা যার উপর সিদ্ধান্ত দাঁড়াবে — একটা প্রশ্ন, যার উত্তর হ্যাঁ বা না। পাইথনে এই উত্তরটার নাম True আর False, আর টাইপটার নাম bool।
আজ আমরা শুধু প্রশ্ন করা শিখব, সিদ্ধান্ত নেওয়া নয়। ধাপটা আলাদা রাখার কারণ আছে: if লিখতে গিয়ে যে ভুলগুলো হয়, তার প্রায় সবই আসলে প্রশ্নটা ভুল লেখা থেকে হয়, if-এর গঠন থেকে নয়।
এই অধ্যায় শেষে আপনি পারবেন
- ছয়টা তুলনার অপারেটর ব্যবহার করতে
=আর==আলাদা করে চিনতেand,or,notদিয়ে ছোট প্রশ্ন জুড়ে বড় প্রশ্ন বানাতে18 <= age <= 60এভাবে চেইন করা তুলনা লিখতে- বলতে কোন ভ্যালুগুলো
Falseনা হয়েও পাইথনের চোখে মিথ্যা
আগে যা জানা লাগবে: ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া।
ছয়টা তুলনা
age = 22
print(age == 22)
print(age != 22)
print(age > 18)
print(age < 18)
print(age >= 22)
print(age <= 21)True
False
True
False
True
Falseপ্রতিটা তুলনার ফলাফল একটা ভ্যালু — True বা False। অর্থাৎ তুলনাকে ভেরিয়েবলে রাখাও যায়:
age = 22
is_adult = age >= 18
print(is_adult)
print(type(is_adult))True
<class 'bool'>এভাবে নাম দিয়ে রাখলে কোড পড়তে অনেক সহজ হয় — is_adult পড়েই বোঝা যায় কী যাচাই হচ্ছে, যেখানে age >= 18 দেখে পাঠককে একবার ভাবতে হয়।
= আর == — এক চিহ্ন কম, পুরো অর্থ আলাদা
total = 100 # an instruction: put 100 into total
print(total == 100) # a question: is total 100?True=রাখে (assignment)==জিজ্ঞেস করে (comparison)
শর্তের জায়গায় ভুল করে = লিখলে পাইথন ৩ সরাসরি এরর দেয়, আর মেসেজটাও কাজের:
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?ভালো খবর — এই ভুলটা নীরবে থাকে না, ধরা পড়ে যায়।
স্ট্রিংয়ের তুলনা
print("rafi" == "rafi")
print("Rafi" == "rafi")
print("apple" < "banana")
print(len("password123") >= 8)True
False
True
Trueদুটো ব্যাপার লক্ষ্য করুন:
ছোট-বড় হাতের অক্ষর আলাদা। "Rafi" আর "rafi" সমান নয়। ইউজারের দেওয়া স্ট্রিং মেলানোর সময় তাই আগেই .strip().lower() চালিয়ে নিতে হয় — নাহলে যিনি নাম বড় হাতের অক্ষরে বা বাড়তি স্পেস দিয়ে লিখেছেন, তিনি বাদ পড়ে যাবেন:
typed = " RAFI "
print(typed == "rafi")
print(typed.strip().lower() == "rafi")False
Trueস্ট্রিংয়েও < কাজ করে, আর সেটা অভিধানের মতো বর্ণানুক্রমে চলে — তাই "apple" < "banana"। নামের লিস্ট সাজানোর সময় এটাই ভিত্তি।
and, or, not
ছোট প্রশ্নগুলো জুড়ে বড় প্রশ্ন বানানো হয় এই তিনটা শব্দে:
age = 22
has_id = True
print(age >= 18 and has_id)
print(age >= 60 or has_id)
print(not has_id)True
True
Falseand— দুটোই সত্য হলে সত্যor— অন্তত একটা সত্য হলে সত্যnot— উল্টে দেয়
পুরো ছবিটা একবারে:
print(True and True)
print(True and False)
print(False and False)
print(True or False)
print(False or False)True
False
False
True
Falseorমানে "এক বা একাধিক", "ঠিক একটা" নয়। বাংলায় "চা না কফি?" বললে সাধারণত একটাই বোঝায়। পাইথনেরor-এ দুটোই সত্য হলেও ফলাফলTrue। এটা মনে না রাখলে শর্ত লেখার সময় অবাক হতে হয়।
not সব সময় তার ঠিক পরের অংশটার উপর কাজ করে, আর সে সবার আগে চলে। ক্রমটা: not আগে, তারপর and, সবার শেষে or।
print(True or False and False)
print((True or False) and False)True
Falseপ্রথম লাইনে and আগে চলেছে, তাই পাইথন পড়েছে True or (False and False), অর্থাৎ True or False — যা True। দ্বিতীয় লাইনে ব্র্যাকেট ক্রমটা বদলে দিয়েছে। সন্দেহ হলে ব্র্যাকেট দিন — গণিতের বেলায় যা সত্য, এখানেও তাই।
চেইন করা তুলনা
দুই সীমার মধ্যে আছে কি না দেখতে পাইথনে গণিতের মতোই লেখা যায়:
marks = 72
print(0 <= marks <= 100)
print(marks > 60 and marks < 80)
print(60 < marks < 80)True
True
Trueদ্বিতীয় আর তৃতীয় লাইন একই কথা বলছে, কিন্তু তৃতীয়টা পড়তে সহজ। অনেক প্রোগ্রামিং ভাষায় এভাবে লেখা যায় না; পাইথনে যায়, আর এটা ব্যবহার করাই উচিত।
কোন ভ্যালুগুলো পাইথনের চোখে মিথ্যা
শুধু False নয় — কয়েকটা সাধারণ ভ্যালুও পাইথন মিথ্যা হিসেবে ধরে:
print(bool(0))
print(bool(1))
print(bool(-5))
print(bool(""))
print(bool("hello"))
print(bool("0"))
print(bool("False"))False
True
True
False
True
True
Trueনিয়মটা এক লাইনে: শূন্য আর ফাঁকা জিনিস মিথ্যা, বাকি সব সত্য। তাই 0 মিথ্যা, ফাঁকা স্ট্রিং "" মিথ্যা; কিন্তু -5 সত্য (শূন্য নয়), আর "0" ও "False" সত্য — কারণ ওগুলো ফাঁকা নয়, ওগুলোর ভেতরে অক্ষর আছে।
শেষ দুটো লাইনই আসল ফাঁদ। input() থেকে আসা সবকিছু স্ট্রিং, তাই ইউজার 0 লিখলেও সেটা "0" — আর পাইথনের কাছে সত্য। সংখ্যার তুলনা করতে চাইলে আগে int() করে নিতে হবে।
এই “ফাঁকা মানে মিথ্যা” নিয়মটার একটা কাজের দিকও আছে — ইউজার কিছু না লিখে এন্টার চাপলে সেটা ধরা যায়:
name = input("Name: ").strip()
print("Name was given:", bool(name))Name:
Name was given: Falseএকটা সম্পূর্ণ উদাহরণ
eligibility.py:
# Check a discount rule without deciding anything yet
age = int(input("Age : "))
years_member = int(input("Years a member : "))
order_total = float(input("Order total : "))
is_adult = age >= 18
is_senior = age >= 60
is_loyal = years_member >= 2
is_large_order = order_total >= 1000
# The rule: adults who are either long-standing members or spending a lot
gets_discount = is_adult and (is_loyal or is_large_order)
print()
print(f"Adult : {is_adult}")
print(f"Senior : {is_senior}")
print(f"Loyal member : {is_loyal}")
print(f"Large order : {is_large_order}")
print(f"Gets discount : {gets_discount}")Age : 34
Years a member : 1
Order total : 1500
Adult : True
Senior : False
Loyal member : False
Large order : True
Gets discount : Trueলক্ষ্য করুন প্রতিটা শর্তকে আলাদা নাম দিয়ে রাখা হয়েছে, আর তারপর সেগুলো জুড়ে নিয়মটা লেখা হয়েছে। পুরো শর্তটা এক লাইনে লিখলে — age >= 18 and (years_member >= 2 or order_total >= 1000) — কোডটা চলত ঠিকই, কিন্তু ছয় মাস পরে ওটা পড়ে নিয়মটা বোঝা কঠিন হত। ব্র্যাকেটটাও জরুরি: ওটা না দিলে and আগে চলে যেত আর নিয়মটাই বদলে যেত।
কিছু ভাঙা অবস্থা ও তার সমাধান
SyntaxError: invalid syntax. Maybe you meant '==' ... তুলনার জায়গায় = লেখা হয়েছে। == দিন।
সমান হওয়ার কথা, কিন্তু False আসছে তিনটা জিনিস দেখুন: বাড়তি স্পেস (.strip()), ছোট-বড় হাতের অক্ষর (.lower()), আর টাইপ — "22" == 22 সব সময় False, কারণ স্ট্রিং আর সংখ্যা কখনো সমান হয় না।
TypeError: '<' not supported between instances of 'str' and 'int' স্ট্রিংয়ের সাথে সংখ্যা তুলনা করতে চেয়েছেন, সম্ভবত input()-এর ফলাফল বদলাতে ভুলে গিয়ে। int() দিয়ে নিন।
দুটো দশমিক সংখ্যা == দিয়ে মিলছে না এটা প্রত্যাশিত — ৫ নম্বর অধ্যায়ের দশমিকের ফাঁদটা মনে করুন। round() করে তুলনা করুন।
শর্তটা যা বলছে তা করছে না and/or-এর ক্রম দেখুন। not আগে, তারপর and, শেষে or। ব্র্যাকেট দিয়ে নিজের উদ্দেশ্যটা স্পষ্ট করে লিখুন।
ধাপ ৪ / ৬ — অনুমান
যাচাই করুন
তিনটা লাইনের আউটপুট কী?
print(5 > 3 and 2 > 4)
print(5 > 3 or 2 > 4)
print(not 5 > 3)- AFalse True True
- BFalse False True
- CTrue True False
- DFalse True False
তিনটা ভ্যালুর সত্য-মিথ্যা রূপ কী?
print(bool("False"))
print(bool(""))
print(bool(0))- ATrue False False
- BTrue True False
- CFalse True False
- DFalse False False
ইউজার Yes লিখেছেন (বড় হাতের Y, শেষে একটা স্পেস), আর প্রোগ্রাম বলছে Continuing: False। কেন, আর সবচেয়ে ভালো সমাধান কী?
answer = input("Type yes to continue: ")
print("Continuing:", answer == "yes")- A`answer`-কে আগে `bool()` দিয়ে বদলে নিতে হবে
- B`==`-এর বদলে `=` লিখতে হবে
- Cতুলনায় বাড়তি স্পেস আর বড় হাতের অক্ষর দুটোই গোনা হয় — `answer.strip().lower() == "yes"` লিখতে হবে
- D`input()` কখনো `"yes"`-এর সমান হতে পারে না, তাই `in` ব্যবহার করতে হবে
উত্তর দিতে অ্যাকাউন্ট লাগবে
উত্তর মিলিয়ে দেখতে সাইন ইন করুন
প্রশ্নগুলো উপরে আছে, আর মাথায় মাথায় উত্তর ভেবে নেওয়াই আসল কাজ। সঠিক উত্তর, ব্যাখ্যা আর তিন ধাপের ইঙ্গিত দেখতে সাইন ইন করুন।
নিজে করুন
password_check.py নামে একটা ফাইল লিখুন, যেটি একটা পাসওয়ার্ড নিয়ে চারটা প্রশ্নের উত্তর True/False আকারে প্রিন্ট করে:
- দৈর্ঘ্য অন্তত ৮
- দৈর্ঘ্য ৮ থেকে ২০-এর মধ্যে (চেইন করা তুলনা দিয়ে লিখুন)
"password"শব্দটা এর ভেতরে নেই (notআরinদুটোই লাগবে, আর তুলনার আগে ছোট হাতের করে নিন)- উপরের তিনটাই একসাথে সত্য কি না
তারপর অন্তত চারটা ভিন্ন পাসওয়ার্ড দিয়ে চালান: একটা খুব ছোট, একটা খুব বড়, একটায় Password শব্দটা বড় হাতের অক্ষরে, আর একটা যেটা সব শর্ত মানে। চারটাতেই উত্তর ঠিক আসছে কি না মিলিয়ে দেখুন — বিশেষ করে তৃতীয়টি, কারণ ওখানেই ছোট-বড় হাতের অক্ষরের ফাঁদটা লুকিয়ে আছে।
এই মিশনে আরও কিছু আছে
উপরে যা পড়েছেন সেটাই সম্পূর্ণ মিশন — কিছু কেটে রাখা হয়নি। প্রো এর সাথে যোগ করে:
- ভেতরে আসলে কী ঘটে — পাইথন কীভাবে এটা চালায়
- অনুশীলনীর সম্পূর্ণ সমাধান, ধাপে ধাপে ব্যাখ্যাসহ
- কঠিন অতিরিক্ত অনুশীলনী
- এই বিষয়ে ইন্টারভিউতে যা জিজ্ঞেস করা হয়, আর তার আদর্শ উত্তর
ধাপ ৬ / ৬
কঠিন করা — অধ্যায়ের কুইজ
সহজ থেকে কঠিন — দশটি প্রশ্ন, শেষেরগুলো ইচ্ছে করেই কঠিন।
সাইন ইন করে কুইজ দিন