Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Условные конструкции Основы Python

В этом уроке вы узнаете, что с помощью условных конструкций можно изменить поведение программы, что будет зависеть от проверяемых условий. Благодаря этому вы сможете писать сложные программы, которые ведут себя в зависимости от ситуации.

if

Для примера рассмотрим функцию, которая определяет тип переданного предложения. Для начала она будет отличать обычные предложения от вопросительных:

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 может находиться в любом месте функции — даже внутри блока кода с условием.

Условная конструкция if

else

Теперь изменим функцию из предыдущего примера так, чтобы она возвращала не просто тип предложения, а целую строку 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

Чтобы конструкцию было легче оформлять, старайтесь выбирать проверку без отрицаний и подстраивайте содержимое блоков под нее.

Конструкция else + if = elif

Функция 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

Тернарный оператор можно вкладывать в тернарный оператор. Но не нужно так делать, так как такой код тяжело читать и отлаживать.


Дополнительные материалы

  1. Логический (булев) тип данных

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
29 сентября 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»