True و False — تعلّم طرح الأسئلة
معاملات المقارنة، and / or / not، المقارنات المتسلسلة، والقيم التي يعتبرها بايثون خاطئة — الأساس المطلوب قبل كتابة الشروط.
كيف تريد أن تتعلم؟
المشكلة التي نقوم بحلها
على البرنامج أن يقرر شيئاً: هل يستحق هذا الطلب خصماً؟ هل كلمة المرور طويلة بما يكفي؟ هل الصنف متوفر في المخزون؟
الكود الذي يتخذ القرار سيأتي في الفصل التالي (if). لكن قبل ذلك نحتاج إلى الشيء الذي يقوم عليه القرار — سؤال جوابه نعم أو لا. في بايثون يسمّى هذان الجوابان True و False، ويسمّى نوعهما bool.
اليوم نتعلم طرح السؤال فقط، لا اتخاذ القرار. هذا الفصل بين الخطوتين مقصود: كل الأخطاء تقريباً التي يقع فيها الناس عند كتابة if هي في الحقيقة أخطاء في السؤال، لا في if نفسها.
في نهاية هذا الفصل ستكون قادراً على
- استخدام معاملات المقارنة الستة
- التمييز بين
=و== - ربط أسئلة صغيرة لتكوين سؤال أكبر باستخدام
andوorوnot - كتابة مقارنات متسلسلة مثل
18 <= age <= 60 - معرفة القيم التي يعتبرها بايثون خاطئة (false) رغم أنها ليست
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)
إذا كتبت = مكان الشرط عن طريق الخطأ، يُظهر بايثون 3 خطأً واضحاً مع رسالة مفيدة:
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". وهذا أساس ترتيب قائمة (list) من الأسماء.
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() أولاً.
ولقاعدة "الفارغ يعني خاطئ" فائدة عملية أيضاً — اكتشاف من ضغط Enter دون أن يكتب شيئاً:
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().
عددان عشريان لا يتساويان مع == هذا متوقع — تذكّر فخ الأعداد العشرية من الفصل 5. قارن بعد استخدام 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 لأربعة أسئلة:
- الطول 8 على الأقل
- الطول بين 8 و 20 (اكتبه كمقارنة متسلسلة)
- كلمة
"password"غير موجودة فيها (ستحتاج إلىnotوinمعاً، وحوّل إلى أحرف صغيرة قبل المقارنة) - هل الثلاثة السابقة صحيحة معاً
ثم شغّله بأربع كلمات مرور مختلفة على الأقل: واحدة قصيرة جداً، وواحدة طويلة جداً، وواحدة تحتوي على Password بحرف كبير، وواحدة تستوفي كل الشروط. تأكد أن الأربع تعطي الإجابة الصحيحة — خاصة الثالثة، لأن فخ حالة الأحرف يختبئ هناك.
في هذه المهمة المزيد
ما قرأته أعلاه هو المهمة كاملة — لم يُحذف منها شيء. يضيف Pro:
- ما يحدث فعلياً في الكواليس — كيف ينفذ بايثون هذا الكود
- الحل الكامل للتمرين مشروحاً خطوة بخطوة
- تمارين إضافية أكثر صعوبة وتحدياً
- أسئلة المقابلات الوظيفية حول هذا الموضوع مع نموذج الإجابة
الخطوة ٦ من ٦
التحدي — اختبار الفصل
عشرة أسئلة متدرجة من السهل إلى الصعب. الأسئلة الأخيرة صعبة عن قصد.
سجّل الدخول لأداء الاختبار