অধ্যায় 08

True আর False — প্রশ্ন করা শেখা

তুলনার অপারেটর, and / or / not, শিকল-তুলনা, আর কোন মানগুলো পাইথনের চোখে মিথ্যা — শর্ত লেখার আগে যে ভিতটা লাগে।

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

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

একটা প্রোগ্রামকে সিদ্ধান্ত নিতে হবে: এই অর্ডারে ছাড় দেওয়া যাবে কি? পাসওয়ার্ডটা যথেষ্ট লম্বা কি? স্টকে মাল আছে কি?

সিদ্ধান্তের কোডটা পরের মিশনে (if)। কিন্তু তার আগে দরকার সেই জিনিসটা যার উপর সিদ্ধান্ত দাঁড়াবে — একটা প্রশ্ন, যার উত্তর হ্যাঁ বা না। পাইথনে এই উত্তরটার নাম True আর False, আর টাইপটার নাম bool।

আজ আমরা শুধু প্রশ্ন করা শিখব, সিদ্ধান্ত নেওয়া নয়। ধাপটা আলাদা রাখার কারণ আছে: if লিখতে গিয়ে যে ভুলগুলো হয়, তার প্রায় সবই আসলে প্রশ্নটা ভুল লেখা থেকে হয়, if-এর গঠন থেকে নয়।

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

  • ছয়টি তুলনার অপারেটর ব্যবহার করতে
  • = আর == আলাদা করে চিনতে
  • and, or, not দিয়ে ছোট প্রশ্ন জুড়ে বড় প্রশ্ন বানাতে
  • 18 <= age <= 60 এভাবে শিকল-তুলনা লিখতে
  • বলতে কোন মানগুলো পাইথনের চোখে মিথ্যা, এমনকি False না হয়েও

আগে যা জানা লাগবে: ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া।


ছয়টি তুলনা

python
age = 22

print(age == 22)
print(age != 22)
print(age > 18)
print(age < 18)
print(age >= 22)
print(age <= 21)
text
True
False
True
False
True
False

প্রতিটি তুলনার ফলাফল একটা মান — True বা False। অর্থাৎ তুলনাকে ভেরিয়েবলে রাখাও যায়:

python
age = 22
is_adult = age >= 18
print(is_adult)
print(type(is_adult))
text
True
<class 'bool'>

এভাবে নাম দিয়ে রাখলে কোড পড়তে অনেক সহজ হয় — is_adult পড়েই বোঝা যায় কী যাচাই হচ্ছে, যেখানে age >= 18 দেখে পাঠককে একবার ভাবতে হয়।

= আর == — এক চিহ্ন কম, পুরো অর্থ আলাদা

python
total = 100          # an instruction: put 100 into total
print(total == 100)  # a question: is total 100?
text
True
  • = রাখে (assignment)
  • == জিজ্ঞেস করে (comparison)

শর্তের জায়গায় ভুল করে = লিখলে পাইথন ৩ সাফ ত্রুটি দেয়, আর বার্তাটাও সহায়ক:

text
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

ভালো খবর — এই ভুলটা নীরবে থাকে না, ধরা পড়ে যায়।

লেখার তুলনা

python
print("rafi" == "rafi")
print("Rafi" == "rafi")
print("apple" < "banana")
print(len("password123") >= 8)
text
True
False
True
True

দুটো ব্যাপার লক্ষ্য করুন:

ছোট-বড় হাতের অক্ষর আলাদা। "Rafi" আর "rafi" সমান নয়। ব্যবহারকারীর দেওয়া লেখা মেলানোর সময় তাই আগেই .lower() চালিয়ে নিতে হয় — নাহলে যিনি নাম বড় হাতের অক্ষরে লিখেছেন, তিনি বাদ পড়ে যাবেন:

python
typed = "  RAFI "
print(typed == "rafi")
print(typed.strip().lower() == "rafi")
text
False
True

লেখাতেও < কাজ করে, আর সেটা অভিধানের ক্রম ধরে চলে — তাই "apple" < "banana"। নামের তালিকা সাজানোর সময় এটাই ভিত্তি।

and, or, not

ছোট প্রশ্নগুলো জুড়ে বড় প্রশ্ন বানানো হয় এই তিনটি শব্দে:

python
age = 22
has_id = True

print(age >= 18 and has_id)
print(age >= 60 or has_id)
print(not has_id)
text
True
True
False
  • and — দুটোই সত্য হলে সত্য
  • or — অন্তত একটা সত্য হলে সত্য
  • not — উল্টে দেয়

পুরো ছবিটা একবারে:

python
print(True and True)
print(True and False)
print(False and False)
print(True or False)
print(False or False)
text
True
False
False
True
False
or মানে "এক বা একাধিক", "ঠিক একটা" নয়। বাংলায় "চা না কফি?" বললে সাধারণত একটাই বোঝায়। পাইথনের or-এ দুটোই সত্য হলেও ফলাফল True। এটা মনে না রাখলে শর্ত লেখার সময় অবাক হতে হয়।

not সব সময় তার ঠিক পরের অংশটার উপর কাজ করে, আর সে সবার আগে চলে। ক্রমটা: not আগে, তারপর and, সবার শেষে or।

python
print(True or False and False)
print((True or False) and False)
text
True
False

প্রথম লাইনে and আগে চলেছে, তাই পাইথন পড়েছে True or (False and False), অর্থাৎ True or False — যা True। দ্বিতীয় লাইনে বন্ধনী ক্রমটা বদলে দিয়েছে। সন্দেহ হলে বন্ধনী দিন — গণিতের বেলায় যা সত্য, এখানেও তাই।

শিকল-তুলনা

দুই সীমার মধ্যে আছে কি না দেখতে পাইথনে গণিতের মতোই লেখা যায়:

python
marks = 72

print(0 <= marks <= 100)
print(marks > 60 and marks < 80)
print(60 < marks < 80)
text
True
True
True

দ্বিতীয় আর তৃতীয় লাইন একই কথা বলছে, কিন্তু তৃতীয়টা পড়তে সহজ। অনেক ভাষায় এভাবে লেখা যায় না; পাইথনে যায়, আর এটা ব্যবহার করাই উচিত।

কোন মানগুলো পাইথনের চোখে মিথ্যা

শুধু False নয় — কয়েকটা সাধারণ মানও পাইথন মিথ্যা হিসেবে ধরে:

python
print(bool(0))
print(bool(1))
print(bool(-5))
print(bool(""))
print(bool("hello"))
print(bool("0"))
print(bool("False"))
text
False
True
True
False
True
True
True

নিয়মটা এক লাইনে: শূন্য আর ফাঁকা জিনিস মিথ্যা, বাকি সব সত্য। তাই 0 মিথ্যা, ফাঁকা লেখা "" মিথ্যা; কিন্তু -5 সত্য (শূন্য নয়), আর "0" ও "False" সত্য — কারণ ওগুলো ফাঁকা নয়, ওগুলোর ভেতরে অক্ষর আছে।

শেষ দুটো লাইনই আসল ফাঁদ। input() থেকে আসা সবকিছু লেখা, তাই ব্যবহারকারী 0 লিখলেও সেটা "0" — আর পাইথনের কাছে সত্য। সংখ্যার তুলনা করতে চাইলে আগে int() করে নিতে হবে।

এই "ফাঁকা মানে মিথ্যা" নিয়মটার একটা কাজের দিকও আছে — ব্যবহারকারী কিছু না লিখে এন্টার চাপলে সেটা ধরা যায়:

python
name = input("Name: ").strip()
print("Name was given:", bool(name))
text
Name: 
Name was given: False

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

eligibility.py:

python
# 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}")
text
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। বন্ধনী দিয়ে নিজের উদ্দেশ্যটা স্পষ্ট করে লিখুন।