كيف تعمل "و" و "أو" عندما يتم دمجها في بيان واحد؟
-
24-09-2019 - |
سؤال
لسبب ما هذه الوظيفة أربكتني:
def protocol(port):
return port == "443" and "https://" or "http://"
هل يمكن لأي شخص أن يشرح ترتيب ما يحدث وراء الكواليس لجعل هذا العمل بالطريقة التي يعمل بها.
فهمت ذلك على أنه هذا حتى جربته:
إما أ)
def protocol(port):
if port == "443":
if bool("https://"):
return True
elif bool("http://"):
return True
return False
أو ب)
def protocol(port):
if port == "443":
return True + "https://"
else:
return True + "http://"
هل هذا نوع من الحالات الخاصة في بيثون ، أم أنني أسيء فهم تمامًا كيف تعمل العبارات؟
المحلول
إنها تعبير قديم. إدخال الأقواس لإظهار الأولوية ،
(port == "443" and "https://") or "http://"
x and y
عائدات y
لو x
هو تروي ، x
لو x
هو شرح. a or b
, ، العكس ، يعود a
إذا كانت تروي ، وإلا b
.
حتى إذا port == "443"
صحيح ، هذا يعيد RHs من and
, ، بمعنى آخر، "https://"
. وإلا فإن and
كاذب ، لذا or
يدخل في اللعب ويعود "http: //" ، إنه RHS.
في Python الحديثة ، هناك طريقة أفضل لترجمة هذا المصطلح القديم هي:
"https://" if port == "443" else "http://"
نصائح أخرى
and
إرجاع المعامل الأيمن إذا كان اليسار صحيحًا. or
إرجاع المعامل الأيمن إذا كان اليسار خطأ. وإلا كلاهما يعيد المعامل الأيسر. يقال لهم تجميع.
C and X or Y
هي المحاولة المبكرة طويلة الأمد من قبل مستخدمي بيثون إلى الوكيل من أجل C ? X : Y
في معظم الأحيان، فإنه يعمل، إلا لو X
هو False
- وقد أدى ذلك إلى العديد من الأخطاء في كود بيثون ، لذلك في بايثون أسئلة وأجوبة, ، ستجد الحل الأكثر صحة (C and [X] or [Y])[0]
لأن قائمة بعنصر واحد ، بغض النظر عن قيمته المنطقية التي تم تقييمها ، تكون دائمًا True
! علي سبيل المثال: [None]
هو True
لكن None
ليس. مثال OP أعلاه يعمل لأن السلسلة التي تمثل X
ليس فارغا.
ومع ذلك ، تغير كل هذا في Python 2.5 ، عندما تمت إضافة المشغل الثلاثي أو المشروط إلى اللغة ، مما يتيح لك استخدام المنظف X if C else Y
كما هو مذكور في الوظائف الأخرى هنا. إذا رأيت التعليمات البرمجية باستخدام التنسيق الأقدم ، فذلك لأن المستخدم كان مبرمجًا لفترة طويلة Python الذي لم يتبنى بناء الجملة الجديد بعد ، فقد قاموا بقطع الكود القديم الآخر ، أو لا يزال صاحب العمل يستخدم 2.4.x ( أو الإصدارات السابقة) ، إلخ
هذا هو الاختراق القبيح الذي لا ينصح به. إنه يعمل بسبب سلوك الدائرة القصيرة لـ and
و or
وأنهم يعيدون إحدى حججهم بدلاً من قيمة منطقية. يعطي استخدام هذه التقنية خطر تقديم الأخطاء التي يصعب العثور عليها ، لذلك لا تستخدمها في رمز جديد.
إليك مثال على كيفية and/or
المصطلح يمكن أن يعطي نتيجة غير متوقعة:
>>> foo = 'foobar'
>>> bar = 'foobar'
>>> x = 0
>>> y = 1
>>> (foo == bar) and x or y # Will this return the value of x if (foo == bar)?
1
تفضل بدلاً من ذلك التدوين الأحدث:
return "https://" if port == "443" else "http://"
قد ترغب في القراءة على "و / أو خدعة" بيثون في هذه المقالة الطبيعة الغريبة و أو في بيثون. إنه يشبه إلى حد ما IIF()
في VBA أو VB ، أو ?:
في اللغات على غرار C.
يعمل هذا البناء لأنه "يتكشف" إلى الكود التالي:
أ و ب ->
if a:
return b
else:
return a
أ أو ب ->
if a:
return a
else:
return b
مع كل الإجابات الجيدة ، وجدت أن هذه العبارات تساعدني في تذكر ذلك بشكل أفضل وتناسب كيفية عمل عقلي (ونأمل أن يكون هناك المزيد من هناك):
"و" إرجاع العنصر الخاطئ الأول (على سبيل المثال ، لا شيء ، "" ، [] ، () ، {} ، 0) أو العنصر الأخير إذا لم يتم العثور على أي شيء (على سبيل المثال ، لم يتم العثور على خطأ)
"أو" إرجاع العنصر الحقيقي الأول أو العنصر الأخير (على سبيل المثال ، لم يتم العثور على صحيح) **
باختصار:
- انهم جميعا يعيدون العنصر الأول الذي يقرر نتيجة البيان. (في أسوأ الحالات ، العنصر الأخير في التسلسل)
لاحظ أن هذه القاعدة تنطبق أيضًا على عبارة "و" أو "أو".