В этом уроке вы узнаете, что с помощью условных конструкций можно изменить поведение программы, что будет зависеть от проверяемых условий. Благодаря этому вы сможете писать сложные программы, которые ведут себя в зависимости от ситуации.
Для примера рассмотрим функцию, которая определяет тип переданного предложения. Для начала она будет отличать обычные предложения от вопросительных:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char == '?':
return 'question'
return 'normal'
print(get_type_of_sentence('Hodor')) # => normal
print(get_type_of_sentence('Hodor?')) # => question
if
— конструкция языка, которая управляет порядком выполнения инструкций. После слова if
ей передается выражение-предикат, и в конце ставится двоеточие. После этого описывается блок кода. Он выполнится, если предикат — истина.
Если предикат — ложь, то блок кода пропускается, и функция продолжает свое выполнение дальше. В нашем случае следующая строчка кода — return 'normal'
— заставит функцию вернуть строку и завершиться.
return
может находиться в любом месте функции — даже внутри блока кода с условием.
Теперь изменим функцию из предыдущего примера так, чтобы она возвращала не просто тип предложения, а целую строку Sentence is normal
или Sentence is question
:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char == '?':
sentence_type = 'question'
else:
sentence_type = 'normal'
return "Sentence is " + sentence_type
print(get_type_of_sentence('Hodor')) # => 'Sentence is normal'
print(get_type_of_sentence('Hodor?')) # => 'Sentence is question'
Мы добавили else
и новый блок. Он выполнится, если условие в if
— ложь. Еще в блок else
можно вкладывать другие условия if
. Else переводится «иначе», «в ином случае».
Оформить конструкцию if-else
можно двумя способами. С помощью отрицания можно изменить порядок блоков:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char != '?':
sentence_type = 'normal'
else:
sentence_type = 'question'
return "Sentence is " + sentence_type
Чтобы конструкцию было легче оформлять, старайтесь выбирать проверку без отрицаний и подстраивайте содержимое блоков под нее.
Функция get_type_of_sentence()
различает только вопросительные и обычные предложения. Добавим в нее поддержку восклицательных предложений:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char == '?':
sentence_type = 'question'
if last_char == '!':
sentence_type = 'exclamation'
else:
sentence_type = 'normal'
return 'Sentence is ' + sentence_type
print(get_type_of_sentence('Who?')) # => 'Sentence is normal'
print(get_type_of_sentence('No')) # => 'Sentence is normal'
print(get_type_of_sentence('No!')) # => 'Sentence is exclamation'
Мы добавили проверку восклицательных предложений — exclamation. Технически эта функция работает, но вопросительные предложения трактует неверно. Еще в ней есть проблемы с точки зрения семантики:
else
описана для второго условия, но не для первого. Поэтому вопросительное предложение становится "normal"
Чтобы исправить ситуацию, воспользуемся еще одной возможностью условной конструкции:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char == '?':
sentence_type = 'question'
elif last_char == '!':
sentence_type = 'exclamation'
else:
sentence_type = 'normal'
return 'Sentence is ' + sentence_type
print(get_type_of_sentence('Who?')) # => 'Sentence is question'
print(get_type_of_sentence('No')) # => 'Sentence is normal'
print(get_type_of_sentence('No!')) # => 'Sentence is exclamation'
Теперь все условия выстроились в единую конструкцию. elif
означает — «если не выполнено предыдущее условие, но выполнено текущее». Получается такая схема:
?
, то 'question'
!
, то 'exclamation'
'normal'
Выполнится только один из блоков кода, который относится ко всей конструкции if
.
Посмотрите на определение функции, которая возвращает модуль переданного числа:
def abs(number):
if number >= 0:
return number
return -number
Но можно записать более лаконично. Для этого справа от return
должно быть выражение, но if
— это инструкция, а не выражение. В Python есть конструкция, которая работает как if-else
, но считается выражением. Она называется тернарный оператор — единственный оператор в Python, который требует три операнда:
def abs(number):
return number if number >= 0 else -number
Общий паттерн выглядит так: <expression on true> if <predicate> else <expression on false>
.
Давайте перепишем начальный вариант get_type_of_sentence()
аналогично.
Было:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
if last_char == '?':
return 'question'
return 'normal'
Стало:
def get_type_of_sentence(sentence):
last_char = sentence[-1]
return 'question' if last_char == '?' else 'normal'
print(get_type_of_sentence('Hodor')) # => normal
print(get_type_of_sentence('Hodor?')) # => question
Тернарный оператор можно вкладывать в тернарный оператор. Но не нужно так делать, так как такой код тяжело читать и отлаживать.
Вам ответят команда поддержки Хекслета или другие студенты.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт