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
.
الوثائق الرسمية:
نعم ، يمكنك استخدامه بهذه الطريقة:
is_fat = True
state = "fat" if is_fat else "not fat"
قراءة المزيد عن المشغل الشرطي الثلاثي
نعم فعلا:
لنفترض أنك تريد إعطاء متغير 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