سؤال

في C# يمكنني بسهولة كتابة ما يلي:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

هل هناك طريقة سريعة لفعل الشيء نفسه في بايثون أم أنني عالق في عبارة "if"؟

هل كانت مفيدة؟

المحلول

في بايثون 2.5، هناك

A if C else B

الذي يتصرف كثيرا مثل ؟:شركة.ومع ذلك فهو مكروه لسببين:سهولة القراءة، وحقيقة أن هناك عادة طريقة أبسط للتعامل مع المشكلة.على سبيل المثال، في حالتك:

stringValue = otherString or defaultString

نصائح أخرى

@ دان

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

هذا النوع من التعليمات البرمجية أطول وأكثر تعبيرًا، ولكنه أيضًا أكثر قابلية للقراءة

حسنا نعم، انها أطول.لست متأكدًا من "أكثر تعبيرًا" و"أكثر قابلية للقراءة".على أقل تقدير، ادعاءك مثير للجدل.بل إنني سأذهب إلى أبعد من ذلك وأقول إنه خطأ تمامًا، وذلك لسببين.

أولاً، يؤكد الكود الخاص بك على عملية صنع القرار (إلى حد كبير).من ناحية أخرى، يؤكد العامل الشرطي على شيء آخر، وهو القيمة (resp.التنازل عن القيمة المذكورة).وهذا هو بالضبط ما يريده كاتب هذا الكود.إن اتخاذ القرار هو في الحقيقة منتج ثانوي للكود.الجزء المهم هنا هو عملية التعيين.يخفي الكود الخاص بك هذه المهمة وسط الكثير من الضوضاء النحوية:المتفرعة.

الكود الخاص بك أقل تعبيراً لأنه يحول التركيز عن الجزء المهم.

وحتى في هذه الحالة، من المحتمل أن تتفوق شفرتك على بعض فنون ASCII الغامضة مثل ?:.مضمنة-if سيكون من الأفضل.أنا شخصياً لا أحب الإصدار الذي تم تقديمه مع Python 2.5 لأنه معكوس.أفضل شيئًا يقرأ في نفس التدفق (الاتجاه) مثل عامل التشغيل الثلاثي C ولكنه يستخدم الكلمات بدلاً من أحرف ASCII:

C = if cond then A else B

هذا يفوز.

لسوء الحظ، ليس لدى C وC# مثل هذا البيان التعبيري.ولكن (وهذه هي الحجة الثانية)، فإن العامل الشرطي الثلاثي للغات C قد تم تأسيسه منذ فترة طويلة لدرجة أنه أصبح لغة في حد ذاته.العامل الثلاثي هو جزء من اللغة بقدر ما هو "التقليدي" if إفادة.نظرًا لأنها لغة، فإن أي شخص يعرف اللغة يقرأ هذا الرمز على الفور بشكل صحيح.علاوة على ذلك، فهي طريقة قصيرة وموجزة للغاية للتعبير عن هذه الدلالات.في الواقع، إنها أقصر الطرق التي يمكن تخيلها.إنها معبرة للغاية لأنها لا تحجب الجوهر بضوضاء لا داعي لها.

أخيرًا، كتب جيف أتوود الاستنتاج المثالي لهذا: أفضل كود هو عدم وجود كود على الإطلاق.

ليس من السيئ أبدًا كتابة تعليمات برمجية معبرة وقابلة للقراءة.

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

يعد هذا النوع من التعليمات البرمجية أطول وأكثر تعبيرًا، ولكنه أيضًا أكثر قابلية للقراءة وأقل احتمالية للتعثر أو سوء التحرير.لا تخف من الكتابة بشكل صريح - يجب أن تكون التعليمات البرمجية القابلة للقراءة هدفًا وليس نتيجة ثانوية.

هناك عدد قليل من التكرارات لهذا السؤال، على سبيل المثال.

في جوهر الأمر، في الإعداد العام، يجب أن يستخدم كود ما قبل 2.5 ما يلي:

 (condExp and [thenExp] or [elseExp])[0]

(نظرًا لأن condExp وthenExp وelseExp عبارة عن تعبيرات عشوائية)، حيث إنها تتجنب النتائج الخاطئة إذا تم تقييمthenExp إلى خطأ منطقي، مع الحفاظ على تقييم الدائرة القصيرة.

بالمناسبة، j0rd4n، أنت لا تفعل ذلك (لو سمحت لا تفعل ذلك!) اكتب رمزًا مثل هذا في C#.وبصرف النظر عن حقيقة أن IsDefaultOrNull ويسمى في الواقع IsNullOrEmpty, ، هذا مجرد تضخم في الكود.تقدم C# مشغل التجميع لمواقف مثل هذه:

string stringValue = otherString ?? defaultString;

صحيح أن هذا لا يعمل إلا إذا otherString يكون null (بدلاً من أن تكون فارغة) ولكن إذا كان من الممكن ضمان ذلك مسبقًا (وغالبًا ما يكون ذلك ممكنًا) فهذا يجعل الكود أكثر قابلية للقراءة.

لقد اكتشفت أيضًا أن مجرد استخدام عامل التشغيل "أو" يعمل بشكل جيد.على سبيل المثال:

finalString = get_override() or defaultString

لو get_override() إرجاع "" أو لا شيء، سيتم استخدامه دائمًا defaultString.

الفصل 4 من موقع Divingintopython.net لديه الجواب.يطلق عليه و-أو الخدعة في بايثون.

يمكنك الاستفادة من حقيقة أن التعبيرات المنطقية تُرجع قيمتها، وليس فقط الحالة الصحيحة أو الخاطئة.على سبيل المثال، يمكنك دائمًا استخدام:

result = question and firstanswer or secondanswer

مع التحذير أنه لا يعمل مثل العامل الثلاثي إذا كانت الإجابة الأولى خاطئة.وذلك لأنه يتم تقييم السؤال أولاً، بافتراض أنه تم إرجاع الإجابة الأولى الصحيحة ما لم تكن الإجابة الأولى خاطئة، لذلك يفشل هذا الاستخدام في العمل مثل العامل الثلاثي.ومع ذلك، إذا كنت تعرف القيم، فلا توجد مشكلة عادةً.على سبيل المثال سيكون:

result = choice == 7 and "Seven" or "Another Choice"

إذا كنت تستخدم روبي، هل يمكن أن تكتب

stringValue = otherString.blank? ? defaultString : otherString;

المدمج في blank? الطريقة تعني فارغة أو فارغة.
تعالوا إلى الجانب المظلم..

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