عوامل المقارنة
اختبر التساوي وعدم التساوي والترتيب ، بالإضافة إلى سلسلة المقارنات في تعبير واحد.
- استخدام == و != و < و <= و > و >= لمقارنة القيم
- سلاسل المقارنات مثل 0 <= x < 10
- فهم كيف يختلف == عن is
- مقارنة قيم من أنواع مختلفة
الحاسوبُ يُدعى إلى قرار
حسابُ 2 + 3 ينتج عددًا. لكن أكثر ما يحتاج البرنامج إلى معرفته ليس عددًا ، بل قرار. هل الدرجة ناجحة؟ هل اسم المستخدم محجوز؟ هل الحرارة ضمن المدى؟ عوامل المقارنة هي فرع العائلة الحسابية الذي يُخرج جوابًا من المجموعة بدلًا من .
عوامل المقارنة الستة
يقارن كلُّ عاملٍ قيمتين وينتج bool:
5 == 5 # True — متساويان
5 != 3 # True — غير متساويين
5 < 10 # True — أصغر من
5 <= 5 # True — أصغر أو يساوي
5 > 10 # False — أكبر من
5 >= 5 # True — أكبر أو يساويفي الرياضيات تكتب و و؛ تختار بايثون الصيغ الصديقة للوحة المفاتيح <= و>= و!=. المعنى لا يتغير. ويتطلب علامةُ == المزدوجة توقفًا متعمدًا: فهي السؤال «هل هذان متساويان؟»، بينما = المفردة أمرٌ بالإسناد. العلامة المزدوجة هي ما يمنع الالتقاء بينهما أبدًا.
سلاسل المقارنات كما يفعل الرياضي
لنقل إن تنتمي إلى الفترة . على الورق تكتب الشرط ثلاثي الأجزاء في زفيرٍ واحد، . تتيح لك بايثون كتابته بالضبط كذلك:
x = 5
0 <= x < 10 # True — يتحقق الشرطان معًا
0 <= x < 3 # False — يخفق الثانيإنه تعبيرٌ واحد يُقيَّم بالاقتران نفسه الذي ستقرؤه: ثم ، وتُحسب القيمة الوسطى مرةً واحدة فقط. سلسلة المقارنة تعادل and ، لكن الصيغة المسلسلة تُقرأ كرياضيات جاءت منها.
== يسأل عن المحتوى؛ وis يسأل عن الهوية
سؤالان يتشابهان لفظًا ويختلفان جوابًا:
a = [1, 2, 3]
b = [1, 2, 3]
a == b # True — المحتوى نفسه
a is b # False — كائنان مختلفان في الذاكرة
c = a
a is c # True — الكائن نفسهيقارن == القيمَ المحمولة؛ ويقارن is المواقعَ في الذاكرة. قد تتطابق عدة صناديق فعلًا على القائمة نفسها؛ لكن الكائن واحد. يتطابق الاثنان عند الصغائر (مثل الأعداد الصحيحة الصغيرة التي تخزّنها بايثون مؤقتًا) ويتفرّقان عند ما سوى ذلك، لذا فالقاعدة ثابتة: استخدم == للمحتوى، واحتفظ بـ is للفرد الأوحد الذي لا محتوى له يُقارَن ، ألا وهو None:
if x is None: # صواب
if x == None: # يعمل، لكنك تسأل السؤال الخطأمقارنة بين الأنواع
إقحام قيمٍ من مجموعاتٍ مختلفة في مقارنة ، مقابل ، يخضع لسياسةٍ محددة:
5 == 5.0 # True — المساواة العددية تتجاهل النوع
"5" == 5 # False — سلسلة و عدد صحيح لا يتساويان أبدًا
"5" < 6 # TypeError: '<' not supported between str and intيقع الترتيبان. للمساواة: تتقارن القيم العددية بالقيمة لا بالنوع، بينما قيمُ الأسَرِ الأجنبية ببساطةٍ لا تتساوى أبدًا. للترتيب: ترفض بايثون التخمين، إذ لا ترتيب كليًا ذا معنى بين سلسلة وعدد صحيح، فتُثير TypeError بدلًا من أن تختلق واحدًا.
مثالٌ محلول: سماحُ الإيصال
لشركِ ضجيجِ الكسورِ جوابًا بنّاءً. قارن ضمن سماحٍ كما يفعل الفيزيائيُّ، أو انتقل إلى وحداتٍ صحيحةٍ دقيقةٍ:
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. التمثيل الثنائي لـ لا نهائيٌّ، فتهبط المجموع إلى . قارن ضمنَ سماحةٍ بدل ذلك: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).
🧩 تحدٍّ ، فكّر أولًا ثم أظهر
اكتب سلسلة مقارنة واحدة تتحقق من أن عددًا يقع في ، دون 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؟