معامل النفي المنطقي not
العاملان and وor يُستخدمان بين قيمتين منطقيتين، ولذلك يسمَّيان عاملين ثنائيين (binary operators). أما not فيأتي قبل قيمة منطقية واحدة فقط، ولذلك يسمى عاملًا أحاديًا (unary operator).
يقلب not القيمة المنطقية التي يطبّق عليها، بطريقة تشبه تأثير إشارة السالب على العدد. جرّب في الطرفية:
not True
جرّب الآن:
not False
ما أولوية not مقارنة بـand وor؟ تتبّع التعبير التالي خطوة بخطوة:
b = True
print(not b or b)
عندما تقيّم التعبير خطوة بخطوة ترى أن:
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 فقط صالحة للمعالجة، وباقي الأنواع غير صالحة. هذا مثال لدالة تحقق ذلك:
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.
In that case there is a standard simplification trick you can apply that we discussed a few pages ago.
In particular the
returnsare redundant becausefilename.endswith(".png") or filename.endswith(".jpg")is already the desired boolean.For the real exercise, you can do something similar.
The difference in the real exercise is that the result is reversed.
That is,
invalid_imagereturnsTruewhenvalid_imagereturnsFalseand vice versa.Remember what
notdoes?
أحسنت! إليك حلين صحيحين:
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