python - المحجوزة - انواع البيانات في البايثون




هل لدى بايثون مشغل شرطي ثلاثي؟ (16)

هل لدى بايثون مشغل شرطي ثلاثي؟

نعم فعلا. من ملف القواعد :

test: or_test ['if' or_test 'else' test] | lambdef

جزء الاهتمام هو:

or_test ['if' or_test 'else' test]

لذلك ، تكون العملية الشرطية الثلاثية هي الشكل:

expression1 if expression2 else expression3

سيتم تقييم expression3 بشكل تكاسل (أي ، يتم تقييمه فقط إذا كان expression2 غير صحيح في سياق منطقي). وبسبب التعريف العودي ، يمكنك تسلسلها إلى أجل غير مسمى (رغم أنها قد تعتبر أسلوبًا سيئًا).

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

ملاحظة حول الاستخدام:

لاحظ أن كل ذلك يجب أن يتبع مع أي else . قد يجد الأشخاص الذين يتعلمون قائمة الفهم وتعبيرات المولد ذلك درسًا صعبًا للتعلم - لن يعمل ما يلي ، حيث تتوقع بايثون تعبيرًا ثالثًا عن آخر:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

الأمر الذي يرفع SyntaxError: invalid syntax . إذاً ، ما سبق هو إما جزء غير مكتمل من المنطق (ربما كان المستخدم يتوقع وجود أمر ما في الحالة الخاطئة) أو ما قد يكون المقصود هو استخدام التعبير 2 كفلتر - يلاحظ أن ما يلي هو بايثون قانوني:

[expression1 for element in iterable if expression2]

expression2 يعمل كمرشح للفهم القائمة ، وليس المشغل الشرطي الثلاثي.

صيغة بديلة لحالة أكثر ضيقة:

قد تجد أنه مؤلم بعض الشيء لكتابة ما يلي:

expression1 if expression1 else expression2

يجب أن يتم تقييم expression1 مرتين مع الاستخدام أعلاه. يمكن أن تحد من تكرار إذا كان مجرد متغير محلي. ومع ذلك ، فإن مصطلح Pythonic المشترك والأداء لهذا الاستخدام هو استخدام or سلوك الاختصار:

expression1 or expression2

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

إذا لم يكن لبيثون مشغل شرطي ثلاثي ، فهل من الممكن محاكاة واحدة باستخدام تركيبات لغة أخرى؟


مشغل ثلاثي في ​​لغات برمجة مختلفة

هنا أحاول فقط إظهار بعض الاختلاف الهام في ternary operator بين اثنين من لغات البرمجة.

مشغل Ternary في Javascript

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

مشغل ثلاثي في ​​روبي

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

المشغل الثلاثي في ​​سكالا

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

مشغل ثلاثي في ​​برمجة R

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

المشغل الثلاثي في ​​بيثون

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

الآن يمكنك رؤية جمال لغة python. قراءته للغاية وقابلة للصيانة.


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

if conditionX:
    print('yes')
else:
    print('nah')

، يصبح:

print('yes') if conditionX else print('nah')

بعض (العديد من :) قد يتغذى عليه باعتباره unpythonic (حتى ، ruby-ish :) ، لكنني شخصياً أجده أكثر طبيعية - أي كيف يمكنك التعبير عنه بشكل طبيعي ، بالإضافة إلى أكثر جاذبية بصريًا في كتل كبيرة من الكود.


إذا تم تعريف متغير وتريد التحقق مما إذا كان له قيمة ، فيمكنك فقط a or b

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

سوف يخرج

no Input
no Input
no Input
hello
['Hello']
True

بالنسبة إلى Python 2.5 والإصدارات الأحدث ، هناك بنية محددة:

[on_true] if [cond] else [on_false]

في Pythons الأقدم ، لا يتم تشغيل مشغل ثلاثي ولكن يمكن محاكاته.

cond and on_true or on_false

على الرغم من ذلك ، توجد مشكلة محتملة ، والتي إذا قيّمت cond إلى True و يقيّم on_true إلى False ثم يتم إرجاع on_true بدلاً من on_true . إذا كنت تريد هذا السلوك فإن الطريقة جيدة ، وإلا استخدم هذا:

{True: on_true, False: on_false}[cond is True] # is True, not == True

والتي يمكن تغليفها بواسطة:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

واستخدمت بهذه الطريقة:

q(cond, on_true, on_false)

وهو متوافق مع جميع إصدارات بايثون.


بناء الجملة: سيتم إعطاء المشغل الثلاثي على النحو التالي:

[on_true] if [expression] else [on_false]

على سبيل المثال

x, y = 25, 50
big = x if x < y else y
print(big)

على الاطلاق ، وهو سهل الفهم بشكل لا يصدق.

general syntax : first_expression if bool_expression_is_true else second_expression

Example: x= 3 if 3 > 2 else 4 
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false

قد تجد في كثير من الأحيان

cond and on_true or on_false

ولكن هذا يؤدي إلى مشكلة عند on_true == 0

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

حيث تتوقع من المشغل الثلاثي العادي هذه النتيجة

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1

محاكاة مشغل الثعبان الثلاثي.

فمثلا

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

انتاج:

'b greater than a'

من الوثائق :

تحمل التعبيرات الشرطية (التي يطلق عليها أحيانًا "المشغل الثلاثي") أدنى أولوية لجميع عمليات بايثون.

التعبير x if C else y أولاً بتقييم الحالة C ( وليس x )؛ إذا كان C صحيحًا ، يتم تقييم x ويتم إرجاع قيمته ؛ خلاف ذلك ، يتم تقييم y ويتم إرجاع قيمته.

انظر PEP 308 لمزيد من التفاصيل حول التعبيرات الشرطية.

جديد منذ الإصدار 2.5.


نعم ، تمت added في الإصدار 2.5.
الصيغة هي:

a if condition else b

يتم تقييم condition الأول ، ثم يتم إرجاع a أو b بناءً على قيمة condition Boolean
إذا تم تقييم condition إلى True يتم إرجاع ، يتم إرجاع b آخر.

فمثلا:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

لاحظ أن الشروط الشرطية هي تعبير ، وليست عبارة . هذا يعني أنه لا يمكنك استخدام التعيينات أو pass أو عبارات أخرى في الشرطية:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

في مثل هذه الحالة ، يجب عليك استخدام بيان if عادي بدلاً من شرطي.

ضع في اعتبارك أنه من المستغرب من قبل بعض Pythonistas لعدة أسباب:

  • يختلف ترتيب الحجج عن العديد من اللغات الأخرى (مثل C ، و Ruby ، ​​و Java ، إلخ) ، والتي قد تؤدي إلى أخطاء عندما يستخدمها أشخاص غير معتادون على سلوك Python "المفاجئ" (قد يقوموا بعكس الترتيب).
  • يجد البعض أنه "غير عملي" ، لأنه يتعارض مع التدفق الطبيعي للفكر (التفكير في الحالة أولاً ثم التأثيرات).
  • أسباب الأسلوب.

إذا كنت تواجه مشكلة في تذكر الطلب ، فتذكر أنه إذا قرأته بصوت عالٍ ، فإنك (تقريبًا) تقول ما تقصده. على سبيل المثال ، x = 4 if b > 8 else 9 تم قراءة x = 4 if b > 8 else 9 بصوت عالٍ حيث أن x will be 4 if b is greater than 8 otherwise 9 .

الوثائق الرسمية:



نعم فعلا:

لنفترض أنك تريد إعطاء متغير x بعض القيمة إذا كان بعض bool صحيحًا وبالمثل

X = 5 إذا كان هناك شيء آخر x = 10

X = [some value] if [if this true value first assessates] else [other value assessates]


يسمح المشغل الشرطي الثلاثي ببساطة باختبار حالة في سطر واحد لتحل محل متعدد الأسطر في حالة جعل الكود مضغوطًا.

بناء الجملة :

[on_true] إذا كان [التعبير] آخر [on_false]

1- طريقة بسيطة لاستخدام المشغل الثلاثي:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- الطريقة المباشرة لاستخدام tuples ، القاموس ، و lambda:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- يمكن كتابة المشغل الثلاثي على النحو التالي:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

يمكن كتابة النهج أعلاه على النحو التالي:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

expression1 إذا كان الشرط else expression2

>>> a = 1
>>> b = 2
>>> 1 if a > b else -1 
-1
>>> 1 if a > b else -1 if a < b else 0
-1

In [1]: a = 1 if False else 0

In [2]: a
Out[2]: 0

In [3]: b = 1 if True else 0

In [4]: b
Out[4]: 1




python-2.5