في Python، تُستخدم الجمل الشرطية if وelif (اختصار لعبارة 'else and if') وelse للتحكم في مسار التنفيذ واتخاذ القرارات في البرنامج.
وعلى خلاف لغات البرمجة الأخرى الكثيرة، لا توفّر إصدارات Python 3.9 وما دونها عبارة تبديل حالات رسمية، بل تستخدم عدة جمل elif لتحقيق غرض مشابه.
يقدّم Python 3.10 صيغة مختلفة من عبارة تبديل الحالات تُسمى pattern matching، وسنتناولها على حدة في مفهوم آخر.
تستخدم الجمل الشرطية تعبيرات يجب أن تُقيَّم إلى True أو False، إما بإرجاع bool مباشرةً، أو بتقييم ما إذا كانت القيمة "صادقة" أو "كاذبة".
x = 10
y = 5
# The comparison '>' returns the bool 'True',
# so the statement is printed.
if x > y:
print("x is greater than y")
...
>>> x is greater than y
عند اقترانها بـif، تُنفَّذ كتلة الكود else الاختيارية عندما يُقيَّم شرط if الأصلي إلى False:
x = 5
y = 10
# The comparison '>' here returns the bool False,
# so the 'else' block is executed instead of the 'if' block.
if x > y:
print("x is greater than y")
else:
print("y is greater than x")
...
>>> y is greater than x
تتيح elif إجراء عدة تقييمات أو فروع.
x = 5
y = 10
z = 20
# The elif statement allows for the checking of more conditions.
if x > y > z:
print("x is greater than y and z")
elif y > x > z:
print("y is greater than x and z")
else:
print("z is greater than x and y")
...
>>> z is greater than x and y
يمكن دمج العمليات المنطقية والمقارنات مع الجمل الشرطية لإجراء اختبارات أكثر تعقيدًا:
>>> def classic_fizzbuzz(number):
... if number % 3 == 0 and number % 5 == 0:
... say = 'FizzBuzz!'
... elif number % 5 == 0:
... say = 'Buzz!'
... elif number % 3 == 0:
... say = 'Fizz!'
... else:
... say = str(number)
...
... return say
>>> classic_fizzbuzz(15)
'FizzBuzz!'
>>> classic_fizzbuzz(13)
'13'
وكبديل، يمكن إعادة كتابة المثال أعلاه بحيث لا يستخدم سوى جمل if مع returns.
غير أن إعادة الكتابة بهذه الطريقة قد تُخفي أن الشروط يُقصد بها أن تكون متنافية، وقد تؤدي إلى bugs مستقبلية أو مشكلات في الصيانة.
>>> def classic_fizzbuzz(number):
... if number % 3 == 0 and number % 5 == 0:
... return 'FizzBuzz!'
... if number % 5 == 0:
... return 'Buzz!'
... if number % 3 == 0:
... return 'Fizz!'
...
... return str(number)
>>> classic_fizzbuzz(15)
'FizzBuzz!'
>>> classic_fizzbuzz(13)
'13'
يمكن أيضًا أن تكون الجمل الشرطية متداخلة.
>>> def driving_status(driver_age, test_score):
... if test_score >= 80:
... if 18 > driver_age >= 16:
... status = "Student driver, needs supervision."
... elif driver_age == 18:
... status = "Permitted driver, on probation."
... elif driver_age > 18:
... status = "Fully licensed driver."
... else:
... status = "Unlicensed!"
...
... return status
>>> driving_status(63, 78)
'Unlicensed!'
>>> driving_status(16, 81)
'Student driver, needs supervision.'
>>> driving_status(23, 80)
'Fully licensed driver.'
مع أن Python لا تملك عاملًا ثلاثيًا مخصصًا بالرمز ?، فمن الممكن كتابة conditional expressions في سطر واحد.
وتأخذ هذه الصيغة الشكل التالي: <value if True> if <conditional test> else <value if False>.
ولأن هذه التعبيرات قد تصبح صعبة القراءة، يُنصح باستخدام هذه الصيغة ذات السطر الواحد فقط إذا كانت تختصر الكود وتساعد على سهولة القراءة.
>>> def just_the_buzz(number):
... return 'Buzz!' if number % 5 == 0 else str(number)
>>> just_the_buzz(15)
'Buzz!'
>>> just_the_buzz(7)
'7'
في Python، يمكن اختبار القيمة المنطقية لأي كائن، ولذلك يمكن استخدامه مع جملة شرطية أو مقارنة أو عملية منطقية.
والكائنات التي تُقيَّم بهذه الطريقة تُعتبر «صادقة» أو «كاذبة»، وتُستخدم في boolean context.
>>> def truthy_test(thing):
... if thing:
... print('This is Truthy.')
... else:
... print("Nope. It's Falsy.")
# Empty container objects are considered Falsy.
>>> truthy_test([])
"Nope. It's Falsy."
>>> truthy_test(['bear', 'pig', 'giraffe'])
'This is Truthy.'
# Empty strings are considered Falsy.
>>> truthy_test('')
"Nope. It's Falsy."
>>> truthy_test('yes')
'This is Truthy.'
# 0 is also considered Falsy.
>>> truthy_test(0)
"Nope. It's Falsy."