cb
codebamin
الفصل 10 · المعاملات المنطقية (Boolean Operators)

معامل النفي المنطقي not

العاملان and وor يُستخدمان بين قيمتين منطقيتين، ولذلك يسمَّيان عاملين ثنائيين (binary operators). أما not فيأتي قبل قيمة منطقية واحدة فقط، ولذلك يسمى عاملًا أحاديًا (unary operator).

يقلب not القيمة المنطقية التي يطبّق عليها، بطريقة تشبه تأثير إشارة السالب على العدد. جرّب في الطرفية:

not True

جرّب الآن:

not False

ما أولوية not مقارنة بـand وor؟ تتبّع التعبير التالي خطوة بخطوة:

__program_indented__

عندما تقيّم التعبير خطوة بخطوة ترى أن:

not True or True

يفسره بايثون على أنه:

(not True) or True

وليس:

not (True or True)

إذن لـnot أولوية أعلى من or عندما لا توجد أقواس. وهذا يشبه أن:

-1 + 2

تعني:

(-1) + 2

وليس:

-(1 + 2)

كما أن not لها أولوية أعلى من and أيضًا. والقاعدة العملية تظل نفسها: عندما تشك في ترتيب التقييم، استخدم الأقواس أو متغيرات وسيطة تجعل المقصود صريحًا.

التمرين: افترض أنك تكتب برنامجًا لمعالجة الصور، ولا يمكنه معالجة إلا أنواع معينة من الملفات. إذا أعطاك المستخدم ملفًا لا يمكن معالجته تريد إظهار خطأ:

if invalid_image(filename): print("I can't process " + filename)

افترض أن ملفات .png و.jpg فقط صالحة للمعالجة، وباقي الأنواع غير صالحة. هذا مثال لدالة تحقق ذلك:

__copyable__ def invalid_image(filename): if filename.endswith(".png") or filename.endswith(".jpg"): return False else: return True

check_result(invalid_image("dog.png"), False) check_result(invalid_image("cat.jpg"), False) check_result(invalid_image("invoice.pdf"), True)

هذا أطول مما يلزم. أعد كتابة invalid_image بحيث يكون جسمها سطرًا واحدًا فقط من الشكل return <expression>، من دون if، مع الحفاظ على الاختبارات نفسها. لاحظ أن شرط «الصورة صالحة» موجود بالفعل، لكن invalid_image تحتاج إلى النتيجة المعكوسة؛ وهنا يأتي دور not.

أحسنت! إليك حلين صحيحين:

def invalid_image(filename): return not (filename.endswith(".png") or filename.endswith(".jpg"))

def invalid_image(filename): return not filename.endswith(".png") and not filename.endswith(".jpg")

هاتان الصيغتان متكافئتان منطقيًا وفق ما يعرف بقانون دي مورغان.

لاحظ أيضًا نمطًا عامًا آخر للتبسيط. إذا كان لديك:

if x: return False else: return True

وكان x نفسه قيمة منطقية، فيمكن اختصار الكود إلى:

return not x

solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>