Ранее мы изучили условный оператор if. С его помощью можно создавать выполнение с двумя разными вариантами через конструкцию if-else. Однако часто бывает нужно предусмотреть несколько путей выполнения программы — три, четыре, или даже пять. Это называется множественным ветвлением.

Рассмотрим пример. Скажем, что в зависимости от возраста, пользователю рекомендуется определенный вид контента. Есть группы: от 3 до 6 лет, от 6 до 12, от 12 до 16, и 16+. Итого, у нас четыре возрастные группы. Как можно решить эту задачу, если использовать только конструкцию if-else?

Наиболее очевидное решение — последовательно проверять, входит ли указанный возраст в одну из групп, используя последовательно расположенные условные операторы:

old = int(input('Ваш возраст: '))

print('Рекомендовано:', end=' ')

if 3 <= old < 6:
    print('"Заяц в лабиринте"')

if 6 <= old < 12:
    print('"Марсианин"')

if 12 <= old < 16:
    print('"Загадочный остров"')

if 16 <= old:
    print('"Поток сознания"')

Примечание: названия фильмов выводятся в двойных кавычках, поэтому строки в программе определяются с помощью одинарных кавычек.

Этот код выполняет поставленную задачу, но имеет значительный недостаток. Он не оптимален, так как каждая инструкция if работает самостоятельно, не учитывая результаты других. Каждое условие проверяется, даже если в этом нет необходимости. Например, если введено число 10, первый if проверяет условие и передает выполнение следующему if, предназначенному для возраста 6 до 12. Как только это условие выполняется, остальная часть программы должна закрыться.

Однако следующая проверка if не учитывает результат предыдущих операций и остается активной, хотя ее выполнение уже излишне. Аналогично процессору приходится проверять последующие условия, даже если уже ясно, что они ложные. Так как же этого избежать?

Ответ — использовать вложенные условные операторы:

old = int(input('Ваш возраст: '))

print('Рекомендовано:', end=' ')

if 3 <= old < 6:
    print('"Заяц в лабиринте"')
else:
    if 6 <= old < 12:
        print('"Марсианин"')
    else:
        if 12 <= old < 16:
            print('"Загадочный остров"')
        else:
            if 16 <= old:
                print('"Поток сознания"')

Рассмотрим, как будет выполняться этот вариант кода. Сначала анализируется условие первого, самого внешнего if. Если оно истина, выполнение идет по этому пути, без обращения к блокам else. Таким образом, если условие внешнего if ложное, выполнение переходит к следующему уровню else, который приносит с собой новый if со своим блоком else. Если введенное значение попадает в диапазон от 6 до 12, программа просто выполнит соответствующий блок и завершается, если нет — переходит к следующему уровню else и so on до последней проверки. Это обеспечивает экономию процессорных ресурсов и делает логику программы более правильной.

Теперь появляется вопрос: можно ли еще сильнее упростить многовариантное ветвление, избежав вложенности? Во многих языках, где отступы важны только для удобочитаемости, подобное записывается в таком формате:

if логическое_выражение {
    … ;
}
else if логическое_выражение {
    … ;
}
else if логическое_выражение {
    … ;
}
else {
    … ;
}

На первый взгляд, кажется, что здесь есть только один уровень вложенности и новое добавление else if. На деле, этот if просто вложен в else. Эта же структура может быть представлена иначе:

if логическое_выражение {
    … ;
}
else 
    if логическое_выражение {
        … ;
    }
    else
        if логическое_выражение {
            … ;
        }
        else {
            … ;
        }

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

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

elif — это сокращение от else if, что можно понимать как "иначе если". Важно знать, что, в отличие от else, в заголовке elif обязательно должно быть указано логическое условие. Давайте перепишем наш пример в if-elif структуре:

old = int (input('Ваш возраст: '))

print('Рекомендовано:', end=' ')

if 3 <= old < 6:
    print('"Заяц в лабиринте"')
elif 6 <= old < 12:
    print('"Марсианин"')
elif 12 <= old < 16:
    print('"Загадочный остров"')
elif 16 <= old:
    print('"Поток сознания"')

Отметим, что в конце, после всех elif, можно использовать ветку else для обработки всех ситуаций, не подпадающих под условия предыдущих блоков. Схематически подход if-elif-…-elif-else можно изобразить так:

Оператор множественного ветвления в Python

Как только выполняется тело if или одного из elif, программа возвращается в основную ветвь (нижний ярко-голубой прямоугольник), и ни else, ни оставшиеся elif не выполняются.

Практическая работа

  1. Возьмите последний вариант кода программы из урока. Добавьте ветвь else для обработки случаев, когда вводятся числа вне указанных диапазонов. Подумайте, почему в первой версии программы, использовавшей несвязанные if, нельзя было применить else для обработки таких случаев, и приходилось добавлять еще один if.
  2. Модифицируйте предыдущую программу для обработки исключения ValueError, возникающего при вводе чисел, не являющихся целыми.
  3. Разработайте программу, запрашивающую у пользователя число. Если оно положительное, вывести 1. Если отрицательное, вывести -1. Если введено 0, вывести 0. Используйте оператор множественного ветвления.

Вопросы для самопроверки:

  1. Какой значительный недостаток имеет программа, использующая последовательное использование нескольких if операторов?
  2. Как можно улучшить производительность программы для многовариантного ветвления?
  3. В чем заключается основное преимущество использования конструкции elif в Python?

Программа курса:

  1. Описание курса
  2. Эволюция и основы языков программирования

    История программирования в кратком и понятном изложении. Что такое машинный язык, почему появились ассемблеры, языки высокого уровня и объектно-ориентированные. Зачем нужен транслятор, и почему он может быть либо компилятором, либо интерпретатором.

  3. Знакомство с основами Python

    Особенности языка Python, работа в интерактивном режиме и подготовка файлов с исходным кодом.

  4. Типы данных и переменные в Python

    Базовые типы данных в Python: целое, вещественное числа, строки. Изменение типа данных с помощью встроенных функций. Понятие об операциях и переменных. Присваивание значения переменной.

  5. Ввод и вывод данных с Python функциями

    Для вывода на экран в Python 3.x используется функция print(). Вывод может быть предварительно отформатирован. Для ввода данных с клавиатуры используется функция input(), которая возвращает в программу строку.

  6. Логические выражения и операторы в Python

    Логические выражения. Логические операторы языка Python: == (равно), != (не равно), (больше), = (больше или равно), and (логическое И), or (логическое ИЛИ), not (отрицание).

  7. Ветвление и условные операторы в Python

    Управление потоком программы с помощью операторов if-else. Создание логических ветвлений, обработка условий и выполнение разных блоков кода в Python.

  8. Изучите обработку ошибок и исключений в Python

    Общее представление об ошибках и исключениях в языке программирования Python. SyntaxError, NameError, TypeError, ValueError, ZeroDivisionError. Обработка исключений с помощью инструкции try-except.

  9. Множественное ветвление с if-elif-else в Python

    Оператор множественного ветвления языка Python позволяет организовать более двух веток выполнения программы без необходимости вложения условных операторов друг в друга. Конструкция включает одну ветку if, произвольное количество elif и необязательную ветку else.

  10. Цикл while и его применение в Python

    С помощью циклов в программировании организуется многократное следующее друг за другом выполнение одних и тех же участков кода. Бывают циклы с условием и со счетчиком. К первым относится цикл while, или цикл "пока".

  11. Изучите функции и их применение в Python

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

  12. Локальные и глобальные переменные в Python

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

  13. Оператор return и возврат значений в Python

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

  14. Параметры и аргументы функций в Python

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

  15. Встроенные функции Python для работы

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

  16. Использование модулей в Python

    Использование модулей в программировании позволяет изолировать код, выполняющий частные задачи, в отдельные файлы. После чего обращаться к нему из разных программ. Создание модулей - следующий шаг после функций, когда участок кода обособляется внутри одного файла-программы. Для языка Python есть множество встроенных и сторонних модулей.

  17. Генерация псевдослучайных чисел в Python

    Для генерации псевдослучайных чисел в языке программирования Python используются функции модуля random. Функция random() генерирует вещественное число от 0 до 1. Функции randint() и randrange() производят целые псевдослучайные числа в указанных диапазонах.

  18. Изучение списков в Python - основы и операции

    Списки в Python - это аналог массивов в других языках программирования. Однако список может содержать элементы разных типов. В терминологии Python список - это изменяемая упорядоченная структура данных. Можно заменять его элементы, добавлять и удалять их, брать срезы. В язык встроены методы для работы со списками.

  19. Изучение цикла for в Python

    Цикл for в языке программирования Python предназначен для перебора элементов структур данных (списков, словарей, кортежей, множеств) и многих других объектов. Это не цикл со счетчиком, каковым является for во многих других языках. Нередко цикл for используется совместно с функцией range(), генерирующей объекты-диапазоны.

  20. Строки в Python - методы и срезы

    В Python строки - это неизменяемые последовательности символов или подстрок. Из них, так же как из списков, можно извлекать отдельные символы с помощью индексов или подстроки с помощью взятия срезов. В языке Python есть множество встроенных строковых методов, позволяющих упростить обработку строк.

  21. Кортежи - неизменяемые структуры данных

    Кортежи в Python - это неизменяемые структуры данных, состоящие из элементов одного или разных типов. Кортежи подобны спискам и обычно используются для защиты последних от изменений. Преобразование одного в другой выполняется с помощью встроенных функций tuple() и list().

  22. Словари в Python - работа с ключами и значениями

    Словарь в Python - это изменяемая неупорядоченная структура данных, элементами которой являются пары "ключ:значение". В словари можно добавлять и удалять элементы, изменять значения ключей. В Python словари имеют ряд методов, упрощающих работу с ними.

  23. Работа с файлами в Python

    В языке программирования Python открытие файлов выполняется с помощью функции open(), которой передается два аргумента - имя файла и режим. Файл может быть открыт в режиме чтения, записи, добавления. Также может быть указан тип файла - текстовый или бинарный. Для файлов есть ряд встроенных методов чтения, записи и др.