У Python конструкції if, elif (скорочення від «else and if») та else використовують, щоб керувати потоком виконання і ухвалювати рішення в програмі.
На відміну від багатьох інших мов програмування, у Python версій 3.9 і нижче немає формальної конструкції case-switch: замість неї для схожої мети використовують кілька конструкцій elif.
У Python 3.10 додано варіант конструкції case-switch під назвою 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.
Однак таке переписування може приховати те, що умови задумані як взаємовиключні, і згодом призвести до помилок або проблем із супроводом коду.
>>> 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."