در Python، دستورهای if، elif (کوتاهشدهای از else و if) و else برای کنترل جریان اجرا و تصمیمگیری در برنامه به کار میروند.
برخلاف بسیاری از زبانهای برنامهنویسی دیگر، نسخههای ۳٫۹ و پایینترِ Python دستور case-switch رسمی ندارند و در عوض از چندین دستور elif برای هدفی مشابه استفاده میکنند.
Python ۳٫۱۰ گونهای دستور case-switch را معرفی میکند که pattern matching نام دارد و در مفهوم دیگری بهطور جداگانه بررسی میشود.
دستورهای شرطی از عبارتهایی استفاده میکنند که باید به True یا False برسند، چه با برگرداندن مستقیم یک bool و چه با ارزیابی «truthy» و «falsy».
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 استفاده کند.
اما بازنویسی به این شکل ممکن است پنهان کند که این شرطها در نظر گرفته شدهاند تا متقابلاً ناسازگار باشند و میتواند در آینده به باگ یا مشکلهای نگهداری منجر شود.
>>> 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 هر شیءای را میتوان از نظر ارزش درستی آزمود و بنابراین میتوان از آن با یک شرط، مقایسه یا عملیات منطقی استفاده کرد.
اشیایی که به این شکل ارزیابی میشوند، «truthy» یا «falsy» در نظر گرفته میشوند و در یک 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."