PyDA Course
📖 درس 6 مبتدئ ⏱ 12 دقيقة ⚡ +10 XP ColabKagglenbviewerBinderDeepnoteGitHub comparison · equality · chaining · bool

عوامل المقارنة

اختبر التساوي وعدم التساوي والترتيب ، بالإضافة إلى سلسلة المقارنات في تعبير واحد.

🎯 ماذا ستتعلم:
  • استخدام == و != و < و <= و > و >= لمقارنة القيم
  • سلاسل المقارنات مثل 0 <= x < 10
  • فهم كيف يختلف == عن is
  • مقارنة قيم من أنواع مختلفة

الحاسوبُ يُدعى إلى قرار

حسابُ 2 + 3 ينتج عددًا. لكن أكثر ما يحتاج البرنامج إلى معرفته ليس عددًا ، بل قرار. هل الدرجة ناجحة؟ هل اسم المستخدم محجوز؟ هل الحرارة ضمن المدى؟ عوامل المقارنة هي فرع العائلة الحسابية الذي يُخرج جوابًا من المجموعة {True,False}\{\mathrm{True}, \mathrm{False}\} بدلًا من R\mathbb{R}.

عوامل المقارنة الستة

يقارن كلُّ عاملٍ قيمتين وينتج bool:

python
5 == 5      # True   — متساويان
5 != 3      # True   — غير متساويين
5 < 10      # True   — أصغر من
5 <= 5      # True   — أصغر أو يساوي
5 > 10      # False  — أكبر من
5 >= 5      # True   — أكبر أو يساوي

في الرياضيات تكتب \leq و\geq و\neq؛ تختار بايثون الصيغ الصديقة للوحة المفاتيح <= و>= و!=. المعنى لا يتغير. ويتطلب علامةُ == المزدوجة توقفًا متعمدًا: فهي السؤال «هل هذان متساويان؟»، بينما = المفردة أمرٌ بالإسناد. العلامة المزدوجة هي ما يمنع الالتقاء بينهما أبدًا.

سلاسل المقارنات كما يفعل الرياضي

لنقل إن xx تنتمي إلى الفترة [0,10)[0, 10). على الورق تكتب الشرط ثلاثي الأجزاء في زفيرٍ واحد، 0x<100 \leq x < 10. تتيح لك بايثون كتابته بالضبط كذلك:

python
x = 5
0 <= x < 10    # True — يتحقق الشرطان معًا
0 <= x < 3     # False — يخفق الثاني

إنه تعبيرٌ واحد يُقيَّم بالاقتران نفسه الذي ستقرؤه: 0x0 \leq x ثم x<10x < 10، وتُحسب القيمة الوسطى مرةً واحدة فقط. سلسلة المقارنة تعادل 0x0 \leq x and x<10x < 10 ، لكن الصيغة المسلسلة تُقرأ كرياضيات جاءت منها.

== يسأل عن المحتوى؛ وis يسأل عن الهوية

سؤالان يتشابهان لفظًا ويختلفان جوابًا:

python
a = [1, 2, 3]
b = [1, 2, 3]
a == b    # True  — المحتوى نفسه
a is b    # False — كائنان مختلفان في الذاكرة

c = a
a is c    # True  — الكائن نفسه

يقارن == القيمَ المحمولة؛ ويقارن is المواقعَ في الذاكرة. قد تتطابق عدة صناديق فعلًا على القائمة نفسها؛ لكن الكائن واحد. يتطابق الاثنان عند الصغائر (مثل الأعداد الصحيحة الصغيرة التي تخزّنها بايثون مؤقتًا) ويتفرّقان عند ما سوى ذلك، لذا فالقاعدة ثابتة: استخدم == للمحتوى، واحتفظ بـ is للفرد الأوحد الذي لا محتوى له يُقارَن ، ألا وهو None:

python
if x is None:    # صواب
if x == None:    # يعمل، لكنك تسأل السؤال الخطأ

مقارنة بين الأنواع

إقحام قيمٍ من مجموعاتٍ مختلفة في مقارنة ، Z\mathbb{Z} مقابل S\mathbb{S} ، يخضع لسياسةٍ محددة:

python
5 == 5.0      # True  — المساواة العددية تتجاهل النوع
"5" == 5      # False — سلسلة و عدد صحيح لا يتساويان أبدًا
"5" < 6       # TypeError: '<' not supported between str and int

يقع الترتيبان. للمساواة: تتقارن القيم العددية بالقيمة لا بالنوع، بينما قيمُ الأسَرِ الأجنبية ببساطةٍ لا تتساوى أبدًا. للترتيب: ترفض بايثون التخمين، إذ لا ترتيب كليًا ذا معنى بين سلسلة وعدد صحيح، فتُثير TypeError بدلًا من أن تختلق واحدًا.

مثالٌ محلول: سماحُ الإيصال

لشركِ ضجيجِ الكسورِ جوابًا بنّاءً. قارن ضمن سماحٍ كما يفعل الفيزيائيُّ، أو انتقل إلى وحداتٍ صحيحةٍ دقيقةٍ:

python
expected = 0.3
price = 0.1 + 0.2                    # 0.30000000000000004
price == expected                    # False — ضجيجُ العائم
abs(price - expected) < 1e-9         # True — ضمن السماح

النمطُ سؤالانِ وقرارٌ: هل هما متساويانِ تمامًا؟ False. وهل ضمنَ قربٍ معقولٍ؟ True. والثاني هو ما تعنيه غالبًا حياةُ الواقعِ.

أخطاء شائعة

  • = مقابل ==. جملة if score = 60: خطأ قواعدي ، لن تدعك بايثون تنشئ إسنادًا داخل شرطٍ بالمصادفة. العلامة المزدوجة حاجزٌ وقائي لا إجراءٌ شكلي.
  • مساواة الأعداد العشرية. 0.1 + 0.2 == 0.3 يعطي False. التمثيل الثنائي لـ 0.10.1 لا نهائيٌّ، فتهبط المجموع إلى 0.300000000000000040.30000000000000004. قارن ضمنَ سماحةٍ بدل ذلك: abs((0.1 + 0.2) - 0.3) < 1e-10.
  • == مع None. جملة x == None تنجح بالمصادفة؛ أما x is None فهي السؤال الذي تعنيه فعلًا.
  • مساواةُ الكسورِ تطلبُ سماحًا؛ والمالُ وحداتٌ كاملة. يفشل 0.1 + 0.2 == 0.3 (False)، فقارن ضمن abs(a - b) < 1e-9 أو اعْدُد بالقروشِ ، فمقارنةُ 120 == 12 * 10 دقيقةٌ.

🧩 تحديات

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

تنبّأ بكل نتيجة دون تشغيل: 5 == 5.0 و"5" == 5 و5 < "6".

💡 الجواب: 5 == 5.0 → True (مساواة عددية عبر الأنواع)، و"5" == 5 → False (سلسلة لا تساوي عددًا صحيحًا أبدًا)، و5 < "6" → TypeError (الترتيب غير معرّف بين int وstr في بايثون 3).

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

اكتب سلسلة مقارنة واحدة تتحقق من أن عددًا nn يقع في [1,100][1, 100]، دون and.

💡 الجواب: 1 <= n <= 100 ، الصيغة المسلسلة تُقرأ تمامًا كالفترة $1 \leq n \leq 100$.

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

لماذا تعطي 0.1 + 0.2 == 0.3 ناتج False؟ وكيف تكتب اختبار مساواةٍ صحيحًا للأعداد العشرية؟

💡 الجواب: لا تملك $0.1$ ولا $0.2$ تمثيلًا ثنائيًّا دقيقًا، فمجموعُهما $0.30000000000000004$ لا $0.3$ حرفيًّا. اختبر ضمن سماحة: abs((0.1 + 0.2) - 0.3) < 1e-10.

🤔 أسئلة سقراطية

  • إذا كان a == b يساوي True، فهل يلزم أن يكون a is b كذلك؟ وفي أيّ ظروفٍ يتساوى كائنان في المحتوى ويتمايزان في الهوية؟
  • لماذا تمنع بايثون 5 < "6" بينما تسمح بأن يكون 5 == "5" مساويًا False؟ وما المبدأ التصميمي الذي يُبقي السلوكين متسقَين؟
  • متى يكون is أداة الحقيقة الصحيحة للمساواة؟ فكّر في الفرد الأوحد None، ولماذا تكون مقارنة المحتوى هناك بلا معنى.

✅ فحص سريع

١. ما ناتج 5 == 5.0؟

٢. إلى ماذا يرجع 0 <= 5 < 10؟

٣. أيُّ صيغةٍ صحيحةٌ لتحقق من أن x هو None؟

comparisonequalitychainingbool