عند تتبع التعبير خطوة بخطوة نرى أن:
name == "Alice" or "Bob"
لا يتحول إلى:
name == ("Alice" or "Bob")
كما قد نتخيل عند قراءته كلغة طبيعية، وإنما يُفهم هكذا:
(name == "Alice") or ("Bob")
وعندما تكون name == "Alice" هي False يعيد or في هذا المثال القيمة الموجودة على اليمين، أي النص "Bob".
القاعدة العملية التي تحتاجها الآن بسيطة: إلى أن تصبح مرتاحًا تمامًا مع سلوك or، ضع تعبيرًا منطقيًا كاملًا على جانبيه، لأنه عامل منطقي. الصيغة name == "Alice" or "Bob" تكسر هذه القاعدة.
إذا كنت فضوليًا، فالتعريف الشائع «A or B تكون True إذا كانت A أو B صحيحة» هو تبسيط مناسب عندما نتعامل مع القيم المنطقية. التعريف الأدق هو: إذا كانت A قيمة truthy فإن A or B يعيد A نفسها ولا يقيّم B أصلًا؛ وإذا لم تكن A truthy فإنه يعيد B. عندما تكون A وB قيمتين منطقيتين يتوافق هذا تمامًا مع التعريف المبسط. هنا A هي name == "Alice"، فإذا كانت False تصبح نتيجة التعبير هي B، أي النص "Bob".
وهل توجد طريقة لتجنب تكرار name ==؟ نعم في بعض الحالات. مثلًا يمكنك استخدام العامل in مع قائمة:
return name in ["Alice", "Bob", "Charlie"]
لكن لا يمكن استبدال كل استخدامات or بهذه الطريقة.
التمرين: اكتب دالة اسمها is_valid_percentage تستقبل وسيطًا عدديًا واحدًا x. يجب أن تعيد True إذا كانت x بين 0 و100 شاملًا الحدين، وأن تعيد False في غير ذلك. يجب أن تستخدم الدالة or وأن تجتاز الاختبارات:
__copyable__ check_result(is_valid_percentage(-1), False) check_result(is_valid_percentage(0), True) check_result(is_valid_percentage(50), True) check_result(is_valid_percentage(100), True) check_result(is_valid_percentage(101), False)
فكّر أولًا في الحالة غير الصالحة: متى تكون النسبة أقل من الحد الأدنى أو أكبر من الحد الأقصى؟