ثلاث كلمات بدلًا من الرموز
المعاملات المنطقية في بايثون هي الكلمات الإنجليزية and وor وnot. وتكتبها لغات أخرى بالرموز && و|| و!. في بايثون يسبب && و|| خطأ SyntaxError، ولا يظهر ! إلا كجزء من != ("لا يساوي").
مع True وFalse تكون القواعد كما تتوقعها:
a | b | a and b | a or b | not a |
|---|---|---|---|---|
True | True | True | True | False |
True | False | False | True | False |
False | True | False | True | True |
False | False | False | False | True |
يحتاج and إلى أن يكون الطرفان صحيحين. ويحتاج or إلى طرف واحد على الأقل. أما not فيأخذ قيمة واحدة ويعكسها.
في الكود الحقيقي يكون الطرفان عادةً عمليتي مقارنة، وتذهب النتيجة إلى if أو while:
المخرجات:
eligible
standard ticket
هذا القدر يكفي لمعظم الشروط. يتناول باقي هذه الصفحة ما تفعله المعاملات مع القيم التي ليست True أو False، والقواعد التي تحدد أي طرف من التعبير يُنفَّذ.
القيم truthy وfalsy
تقبل and وor وnot أي قيمة، وليس القيم المنطقية وحدها. تحدد بايثون ما إذا كانت القيمة تُعدّ صحيحة بحسب "صوابها" (truthiness). هذه القيم falsy، أي تُعامل على أنها خاطئة:
FalseوNone- الصفر من أي نوع عددي:
0و0.0 - الحاويات والنصوص الفارغة:
""و[]و()و{}وset()وrange(0)
كل ما عدا ذلك truthy، أي يُعامل على أنه صحيح، بما في ذلك "0" و"False" و[0] و-1. يمكنك أن ترى كيف تصنّف بايثون قيمة ما باستخدام bool():
المخرجات:
0 False
1 True
-1 True
'' False
'0' True
[] False
[0] True
None False
0.0 False
النص "0" قيمة truthy لأنه نص غير فارغ. وهذه النقطة توقع من يقرأ الأرقام من الإدخال ويختبرها قبل تحويلها. تشرح صفحة الأعداد والقيم المنطقية العلاقة بين bool وint.
and وor يُرجعان أحد الطرفين
هنا تختلف بايثون عن معظم اللغات. لا يُنتج and وor قيمة True أو False جديدة، بل يُرجعان إحدى القيمتين اللتين أعطيتهما:
x or yتُرجعxإذا كانتxقيمة truthy، وإلا تُرجعy.x and yتُرجعxإذا كانتxقيمة falsy، وإلا تُرجعy.
عندما يكون الطرفان قيمتين منطقيتين، فإن "إرجاع أحد الطرفين" و"إرجاع قيمة منطقية" شيء واحد، ولهذا يمر الفرق دون أن يلاحظه أحد حتى تمزج أنواعًا أخرى.
not هو الاستثناء: يُرجع دائمًا True أو False.
إذا احتجت إلى قيمة منطقية حقيقية من تعبير and/or، مثلًا لتخزينها أو لإرجاعها من دالة تَعِد بإرجاع bool، فضعه داخل bool():
التقييم القصير
تقيّم بايثون and وor من اليسار إلى اليمين، وتتوقف بمجرد أن تُعرف الإجابة:
- يتوقف
andعند أول قيمة falsy، لأن لا شيء بعدها يمكن أن يجعل التعبير كله صحيحًا. - يتوقف
orعند أول قيمة truthy، لأن لا شيء بعدها يمكن أن يجعل التعبير كله خاطئًا.
الطرف المتخطّى لا يُنفَّذ إطلاقًا. يمكنك أن تشاهد ذلك يحدث باستخدام دوال تطبع شيئًا عند استدعائها:
المخرجات:
and:
checking A
False
or:
checking A
True
لا يُفحص B في أي من الحالتين. التقييم القصير هو ما يجعل شروط الحماية آمنة. النصف الثاني من كل شرط أدناه سينهار لو نُفّذ وحده، لكنه لا يُنفَّذ إلا بعد أن يستبعد النصف الأول الحالة السيئة:
ضع الاختبار الرخيص أو الحامي أولًا. أما عكس الترتيب، user.startswith("admin") and user is not None، فيطلق AttributeError عندما تكون user هي None.
أنماط مبنية على or وand
لأن or يُرجع أول طرف truthy، فهو يعطيك قيمة افتراضية في سطر واحد:
المخرجات:
Hello, Ada!
Hello, guest!
Hello, guest!
المشكلة أن or يستبدل كل قيمة falsy، وليس None وحدها. فإذا كانت 0 أو "" أو [] مدخلًا مشروعًا، سيتخلص منه or:
استخدم x if x is not None else default عندما يكون الصفر أو القيمة الفارغة قيمة صالحة. تشرح صفحة if/else هذا التعبير الشرطي.
ولـand نمط مقابل: "استخدم هذه القيمة فقط إذا كانت الأولى موجودة". وهو أقل شيوعًا، وغالبًا يكون أوضح إذا كُتب بـif، فاستخدمه باعتدال:
الأولوية: not ثم and ثم or
عندما يمزج تعبير المعاملات الثلاثة، تطبّق بايثون not أولًا، ثم and، ثم or. وتُطبَّق المقارنات مثل == و< وin قبلها جميعًا.
a or b and c و(a or b) and c تعطيان إجابتين مختلفتين من القيم نفسها، لذا ينبغي أن يحمل الشرط المختلط أقواسًا حتى لو كان الترتيب الافتراضي صحيحًا بالصدفة. الأقواس لا تكلّف شيئًا، وتُعفي القارئ التالي من السؤال.
and/or مقابل &/|
يشبه & و| في الشكل and وor، وقد يعطيان الإجابة نفسها أحيانًا، لكنهما معاملان مختلفان.
andوorيختبران صواب القيمة، ويطبّقان التقييم القصير، ويُرجعان أحد الطرفين.&و|معاملان على مستوى البت. مع الأعداد الصحيحة يدمجان بتات العددين. ومع المجموعات يعنيان التقاطع والاتحاد. ومعTrueوFalseيُرجعان قيمة منطقية. ولا يطبّقان التقييم القصير أبدًا: يُقيَّم الطرفان دائمًا.
ولمعاملات البت أيضًا أولوية أعلى من المقارنات، وهذا يحوّل شرطًا مكتوبًا بـ& إلى شيء مختلف تمامًا:
1 & y هي 1 & 5، وتساوي 1، فيصبح السطر الأوسط السلسلة 5 > 1 > 1، و1 > 1 خاطئة. في كود بايثون العادي، استخدم and وor وnot في الشروط.
المكان الوحيد الذي تكون فيه & و| و~ صحيحة في الشروط هو NumPy وpandas. تحمل المصفوفة قيمًا كثيرة، فلا تملك قيمة صواب واحدة، ويطلق and الخطأ ValueError: The truth value of an array ... is ambiguous. تعيد المكتبتان تعريف & و| لتعملا عنصرًا بعنصر، ولهذا تبدو مرشّحات pandas بهذا الشكل df[(df.age > 18) & (df.country == "CA")]، مع أقواس حول كل مقارنة بسبب الأولوية المذكورة أعلاه.
any() وall(): and وor على قائمة كاملة
لدمج سلسلة كاملة من الشروط، استخدم الدالتين المدمجتين all() (أي and على كل العناصر) وany() (أي or على كل العناصر). وكلتاهما تطبّق التقييم القصير بالطريقة نفسها:
على عكس and وor، تُرجع any() وall() دائمًا قيمة منطقية.
أخطاء شائعة
مقارنة متغير واحد بعدة قيم باستخدام or. هذا الشرط صحيح دائمًا:
تقرأ بايثون الشرط الأول على أنه (color == "red") or "blue". المقارنة تساوي False، فيُرجع or القيمة "blue"، وهي نص غير فارغ، أي قيمة truthy. كرر المقارنة في الطرفين، أو الأفضل أن تختبر العضوية باستخدام in.
كتابة && أو ||. كلاهما يسبب SyntaxError. استخدم and وor.
توقّع قيمة منطقية من and/or. x = a or b تخزّن a أو b نفسها. وهذا غالبًا ما تريده، لكن إذا كان يجب أن تُرجع الدالة True أو False، فحوّل النتيجة باستخدام bool().
الاعتماد على الأولوية في الشروط المختلطة. a or b and c تعبير صحيح ومعرّف جيدًا، لكن أضف الأقواس حتى لا يضطر أحد إلى تذكّر القاعدة.
الأسئلة الشائعة
ماذا يفعل المعامل and في بايثون؟
a and b يكون صحيحًا فقط عندما يكون الطرفان صحيحين. تقيّم بايثون a أولًا، فإذا كانت a قيمة falsy أرجعتها دون النظر إلى b، وإلا أرجعت b. ومع القيم المنطقية العادية تحصل على النتيجة المعتادة: True and False تساوي False.
لماذا تُرجع 0 or 5 القيمة 5 بدلًا من True؟
0 or 5 القيمة 5 بدلًا من True؟المعاملان or وand يُرجعان أحد طرفيهما، وليس قيمة منطقية جديدة. x or y تُرجع x إذا كانت x قيمة truthy، وإلا تُرجع y. و0 قيمة falsy، لذا تُرجع 0 or 5 القيمة 5. ضع التعبير داخل bool() إذا احتجت إلى True أو False حقيقية.
ما الفرق بين and و& في بايثون؟
and و& في بايثون؟and معامل منطقي: يختبر صواب القيمة ويطبّق التقييم القصير. أما & فمعامل على مستوى البت: مع الأعداد الصحيحة يدمج البتات (6 & 3 تساوي 2)، ومع المجموعات يأخذ التقاطع، ويقيّم الطرفين دائمًا. استخدم and في شروط if. الاستثناء هو NumPy وpandas، حيث & هو and عنصرًا بعنصر.
أيهما يُنفَّذ أولًا في بايثون، and أم or؟
not هو الأقوى ارتباطًا، ثم and، ثم or. لذا فإن a or b and c تعني a or (b and c)، وnot a or b تعني (not a) or b. ومعاملات المقارنة مثل == و< أقوى ارتباطًا من الثلاثة كلها.
هل يمكنني استخدام && و|| في بايثون؟
لا. && و|| يسببان SyntaxError في بايثون. المعاملات المنطقية هي الكلمات and وor وnot. أما & أو | المفردة فصحيحة لكنها تعني شيئًا آخر (and/or على مستوى البت).