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

الدمج بين and و or وأسبقية العمليات

عندما تستخدم and وor معًا في تعبير واحد، فالأمر يشبه استخدام * و+ معًا: للعوامل ترتيب أولوية محدد.

جرّب التعبير التالي في الطرفية. ماذا تتوقع أن تكون النتيجة؟

True or False and False

إذا قرأت التعبير بسرعة من اليسار إلى اليمين فقد تظن أن:

True or False and False

تعني:

(True or False) and False

لكن بايثون يفسرها فعليًا هكذا:

True or (False and False)

والسبب أن and لها أولوية أعلى من or.

هذا فرق مهم: التفسير الأول يصبح True and False، أي False، بينما التفسير الثاني يصبح True or False، أي True. جرّب الصيغتين مع الأقواس في الطرفية للتأكد.

عند دمج عوامل مختلفة، كن دقيقًا. استخدم الأقواس إذا كان هناك أي احتمال للالتباس، أو قسّم التعبير إلى أجزاء أصغر وضع كل جزء في متغير. هذا يجعل الكود أوضح وأسهل قراءة ويجنبك أخطاء صعبة الملاحظة.

حان وقت التمرين. افترض أنك تكتب برنامجًا للعبة Tic-Tac-Toe. نحتاج إلى التحقق هل فاز أحد اللاعبين. الدالة all_equal التي كتبناها سابقًا مفيدة لفحص الصفوف.

اكتب دالة تتحقق هل توجد ثلاثة قطع متساوية على أحد القطرين. اللوحة عبارة عن قائمة متداخلة board تحتوي على 3 قوائم فرعية، وكل قائمة تمثل صفًا من 3 نصوص. مثال:

board = [ ['X', 'O', 'X'], ['X', 'X', 'O'], ['O', 'O', 'X'] ]

يجب أن تعيد الدالة قيمة منطقية: True إذا كان أحد القطرين يحتوي على ثلاث قطع متساوية، وFalse في غير ذلك. انسخ الهيكل والاختبارات التالية واستبدل ... بكودك:

__copyable__ def diagonal_winner(board): ...

check_result( diagonal_winner( [ ['X', 'O', 'X'], ['X', 'X', 'O'], ['O', 'O', 'X'] ] ), True )

check_result( diagonal_winner( [ ['X', 'X', 'O'], ['X', 'O', 'O'], ['O', 'X', 'X'] ] ), True )

check_result( diagonal_winner( [ ['O', 'X', 'O'], ['X', 'X', 'X'], ['O', 'O', 'X'] ] ), False )

هناك قطران فقط. افحص تساوي عناصر كل قطر باستخدام and، ثم اجمع نتيجتي القطرين باستخدام or.

أحسنت! كان هذا تمرينًا صعبًا. إليك حلًا ممكنًا:

def diagonal_winner(board): middle = board[1][1] return ( (middle == board[0][0] and middle == board[2][2]) or (middle == board[0][2] and middle == board[2][0]) )

وحلًا آخر:

diagonal1 = all_equal([board[0][0], board[1][1], board[2][2]]) diagonal2 = all_equal([board[2][0], board[1][1], board[0][2]]) return diagonal1 or diagonal2

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