الدمج بين 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.
How many diagonals are there on the board?
Which entries of the three sublists make up each diagonal? How can you access these entries?
Every list always has 3 entries, so no need for a loop.
There are two problems to solve here: checking for a win in a specific diagonal, and combining the checks for each diagonal.
One problem can be solved using
and, the other usingor.There's a lot of similarity with the
all_equalfunction. You can even call that function to help! But then you have to include its definition.Similar to
all_equal, check that the 3 entries on a diagonal are equal to each other, e.g. by usingand.Check the two diagonals together, using
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