الفصل 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 تعود في الحقيقة إلى خطأ في صياغة السؤال نفسه.

في نهاية هذا الدرس ستكون قادراً على

  • استخدام معاملات المقارنة الستة
  • التمييز بدقة بين = و ==
  • دمج الأسئلة البسيطة في شروط أكبر باستخدام 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 يوضح بدقة ما يتم فحصه.

الفرق بين = و ==

python
total = 100          # أمر: أسند القيمة 100 إلى total
print(total == 100)  # سؤال: هل total يساوي 100؟
text
True
  • = إسناد وتخزين
  • == مقارنة وسؤال

إذا كتبت = في مكان يتطلب شرطاً، سيظهر لك بايثون 3 رسالة خطأ واضحة:

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 يعني "واحد أو أكثر"، ولا يعني "واحد فقط". إذا كان الطرفان صحيحين، فالنتيجة هي True.

يتم تطبيق not دائماً على ما يليه مباشرة ويُنفّذ أولاً. ترتيب الأولويات: أولاً not، ثم and، وأخيراً or.

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

عند الشك، استخدم الأقواس دائماً.

المقارنات المتسلسلة (Chained comparisons)

للتحقق مما إذا كانت القيمة تقع بين حدين، يتيح لك بايثون كتابتها بالطريقة الرياضية المألوفة:

python
marks = 72

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

السطران الثاني والثالث يؤديان نفس الغرض تماماً، والسطر الثالث أكثر أناقة وسهولة في القراءة.

القيم التي يعتبرها بايثون خاطئة (Falsy)

لا تقتصر القيم الزائفة على False فقط، بل هناك قيم أساسية أخرى يعتبرها بايثون بمثابة 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

القاعدة باختصار: الصفر والقيم الفارغة تُعتبر False، وكل ما عدا ذلك يُعتبر True. ولهذا فإن النصوص مثل "0" و "False" تعتبر True لأنها سلاسل نصية غير فارغة وتحتوي على محارف!

وهذا فخ شائع لأن كل ما يدخله المستخدم عبر input() يكون نصاً، فإن قام بكتابة 0 فإن المتغير يحتوي على النص "0" الذي يعتبره بايثون True!


مثال عملي كامل

ملف 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

حالات الخطأ الشائعة

SyntaxError: invalid syntax. Maybe you meant '==' ... استخدمت = في مكان يتطلب مقارنة. استبدلها بـ ==.

القيمتان تبدوان متطابقتين، ولكن النتيجة False تأكد من ثلاثة أمور: المسافات الزائدة (.strip())، وحالة الأحرف (.lower())، ونوع البيانات — فالنص "22" لا يساوي الرقم 22 أبداً.

TypeError: '<' not supported between instances of 'str' and 'int' قمت بمقارنة نص برقم، ويرجع ذلك غالباً لنسيان تحويل ناتج input(). استخدم دالة int().