المعامل المنطقي and
هناك عامل منطقي آخر في بايثون هو and.
التعبير A and B تكون قيمته True فقط إذا كانت A وB كلتاهما True. وفي أي حالة أخرى تكون النتيجة False.
جرّبه في الطرفية:
True and True
جيد، جرّب الآن:
True and False
ماذا تتوقع؟ توقع النتيجة قبل التنفيذ.
وأخيرًا جرّب:
False and False
لنتدرّب. كتبنا سابقًا دالة is_valid_percentage باستخدام or. هذا مثال لحل صحيح:
def is_valid_percentage(x):
if x < 0 or x > 100:
return False
else:
return True
check_result(is_valid_percentage(-1), False)
check_result(is_valid_percentage(0), True)
check_result(is_valid_percentage(50), True)
check_result(is_valid_percentage(100), True)
check_result(is_valid_percentage(101), False)
أعد كتابة الدالة باستخدام and بدلًا من or.
الحل باستخدام or يبدأ باكتشاف أن x غير صالحة، ثم يعتبر غير ذلك صالحًا. مع and اعكس الفكرة: عبّر مباشرة عن كون x داخل المجال الصحيح، ثم عدّل قيم return وعوامل المقارنة بما يناسب ذلك.
إذا كتبت شيئًا مثل
x < 0 and x > 100فأنت في الاتجاه الخطأ؛ هذا سيكونFalseلأي قيمة لـx.حل
andيختلف عن حلorفي عدة نقاط.حلنا باستخدام
orيحدد أولًا هلxنسبة غير صالحة، وإلا يعتبرها صالحة. معandستفعل العكس.لذلك ستحتاج إلى عكس تعليمات
return.وستحتاج إلى تغيير عوامل المقارنة أيضًا.
رائع! أحد الحلول الممكنة هو:
def is_valid_percentage(x):
if 0 <= x and x <= 100:
return True
else:
return False
وكما فعلنا سابقًا، يمكن تبسيطه إلى:
def is_valid_percentage(x):
return 0 <= x and x <= 100
وهناك اختصار إضافي يسمى سلسلة المقارنات(comparison chaining). أي شرط من الشكل:
a < b and b < c
يمكن اختصاره إلى:
a < b < c
يعمل ذلك مع عوامل المقارنة الأخرى أيضًا، ومنها ==، ويمكن أن يختلف العاملان. لذلك يمكن كتابة الحل النهائي هكذا:
def is_valid_percentage(x):
return 0 <= x <= 100
التمرين التالي: لديك قائمة من ثلاثة عناصر، وتريد التحقق هل العناصر الثلاثة كلها متساوية:
def all_equal(row):
...
check_result(all_equal(["X", "X", "X"]), True)
check_result(all_equal(["O", "O", "O"]), True)
check_result(all_equal(["X", "O", "X"]), False)
القائمة تحتوي دائمًا على ثلاثة عناصر، لذلك لا تحتاج إلى حلقة. يجب أن يكون العنصر الأول مساويًا للثاني، ومساويًا للثالث أيضًا.
القائمة ستحتوي دائمًا على 3 عناصر.
إذًا لا تحتاج إلى حلقة.
تذكر أنك تستطيع الوصول إلى العنصر الأول باستخدام
row[0].يجب أن تكون العناصر الأول والثاني والثالث متساوية.
أي أن العنصر الأول يساوي الثاني ويساوي الثالث أيضًا.
أحسنت. توجد عدة حلول صحيحة، منها:
def all_equal(row):
return row[0] == row[1] and row[0] == row[2]
أو باستخدام المقارنة المتسلسلة:
return row[0] == row[1] == row[2]
أو بمقارنة الصف بقائمة تحتوي العنصر الأول ثلاث مرات:
return row == [row[0], row[0], row[0]]