سؤال

لسبب ما هذه الوظيفة أربكتني:

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) أو العنصر الأخير إذا لم يتم العثور على أي شيء (على سبيل المثال ، لم يتم العثور على خطأ)

  • "أو" إرجاع العنصر الحقيقي الأول أو العنصر الأخير (على سبيل المثال ، لم يتم العثور على صحيح) **

باختصار:

  • انهم جميعا يعيدون العنصر الأول الذي يقرر نتيجة البيان. (في أسوأ الحالات ، العنصر الأخير في التسلسل)

لاحظ أن هذه القاعدة تنطبق أيضًا على عبارة "و" أو "أو".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top