الدمج بين 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 في غير ذلك. انسخ الهيكل والاختبارات التالية واستبدل ... بكودك:
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.
كم قطرًا توجد في اللوحة؟
أي عناصر من القوائم الفرعية الثلاثة تكوّن كل قطر؟ وكيف تصل إلى هذه العناصر؟
كل قائمة تحتوي دائمًا على 3 عناصر، لذلك لا تحتاج إلى حلقة.
لديك مسألتان: التحقق من الفوز في قطر محدد، ثم جمع نتيجتي القطرين.
يمكن حل إحدى المسألتين باستخدام
and، والأخرى باستخدامor.هناك تشابه كبير مع الدالة
all_equal. ويمكنك حتى استدعاؤها للمساعدة، لكن عندها يجب تضمين تعريفها.كما في
all_equal، تحقق أن العناصر الثلاثة على القطر متساوية، مثلًا باستخدام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