Python для сбора и анализа данных

Алла Тамбовцева, НИУ ВШЭ

Данный ноутбук основан на лекции Щурова И.В., курс «Программирование на языке Python для сбора и анализа данных» (НИУ ВШЭ).

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

Условные конструкции – конструкции с операторами условия. Условная конструкция обычно предполагает «развилку»: если условие выполняется, то должен выполняться один набор действий, если нет – другой набор действий. Давайте напишем программу, которая будет просить пользователя ввести целое число, и если это число менее 10, на экран будет выводиться сообщение "Мало", иначе – "Много". И заодно познакомимся с конструкцией if-else.

In [1]:
x = int(input("Введите число: "))
Введите число: 3
In [2]:
if x < 10:
    print("Мало")
else:
    print("Много")
Мало

В части с if мы прописываем условие, в зависимости от которого Python будет делать выбор, что выводить на экран, а после двоеточия перечисляем действия, которые будут выполняться в случае, если x удовлетворяет условию. В части с else мы уже не пишем никакого условия – оператор else сам по себе означает «в случае, если условие в выражении с if не выполнено».

Часть с else является необязательной: программа может существовать только с условием if. Тогда в случае невыполнения условия ничего происходить не будет, Python просто перейдет к следующим строкам кода.

Как быть, если условий несколько? Например, мы просим пользователя ввести число, и если число больше 10, на экране должно быть сообщение "Много", если ровно 10 – "В самый раз", если меньше – "Мало". Условные конструкции можно вкладывать друг друга, главное не забывать при этом про отступы:

In [3]:
if x < 10:
    print("Мало")
else:
    if x == 10:
        print("В самый раз")
    else: 
        print("Много")
Мало

Можно воспользоваться оператором elif, который по смыслу является сочетанием else + if: если предыдущее условие невыполнено, то, нужно проверить следующее условие, и если оно тоже не выполнено, то уже перейти к ветке с else.

In [4]:
if x < 10:
    print("Мало")
elif x == 10:
    print("В самый раз")
else: 
    print("Много")
Мало

Ответвлений с elif может быть несколько: сколько условий, столько и выражений с elif.

Законный вопрос: а можно ли обойтись совсем без elif, просто записав несколько выражений с if? Тут все зависит от ситуации. Иногда решения использовать elif и if, не меняя остальной код, будут равнозначными. Если мы перепишем код в примере выше, заменив elif на if, ничего не изменится, так как условия будут проверяться последовательно в любом случае: если число меньше 10, будет выведено слово «Мало», если нет – программа перейдет к следующему условию, и так далее.

В случае, когда условия как-то связаны между собой, нужно быть более внимательными. Рассмотрим такой пример.

Случай 1.

In [5]:
mark = int(input("Введите оценку: "))
Введите оценку: 3
In [6]:
if mark < 10:
    print("Это нормально")
elif mark == 10:
    print("Отлично")
if mark < 6:
    print("Плохо")
Это нормально
Плохо

Если оценка меньше 10, мы выводим на экран сообщение "Это нормально", если нет, то проверяем, равна ли она 10: если да, то выводим "Отлично", если нет – ничего не делаем. При этом, после всех этих действий делаем дополнительную проверку: если оценка меньше 6, выводим "Плохо".

Случай 2.

In [7]:
if mark < 10:
    print("Это нормально")
elif mark == 10:
    print("Отлично")
elif mark < 6:
    print("Плохо")
Это нормально

Если оценка меньше 10, мы выводим на экран сообщение "Это нормально", если нет, то проверяем, равна ли она 10: если да, то выводим "Отлично", если нет – сравниваем ее с 6. Если оценка меньше 6, выводим "Плохо".

Почему во втором случае мы не увидели сообщение "Плохо"? Потому что из-за второго elif мы попросту до него не дошли! На ветку со вторым elif мы попадаем в случае, если предыдущее условие не выполняется, то есть если оценка не равна 10. А на ветку с первым elif мы попадем, в случае, если оценка не менее 10. Получается, что мы должны выводить слово "Плохо" в случае, когда оценка более 10 и при этом менее 6, чего в природе не бывает. Использовав elif необдуманно, мы добавили лишнее условие, которое никогда не будет выполняться! Тут будет полезно вспомнить схемы, которые многие, наверное, видели на уроках информатики в школе. Запоминать их необязательно, просто они хорошо иллюстрируют различия между двумя случаями.

Случай 1

title

Случай 2

title

Возможно, предыдущее обсуждение if и elif могло вас чуть-чуть запутать, но это не повод расстраиваться. Важно просто помнить, что разница между этими операторами есть. Остальное можно проверить экспериментально на конкретном примере :)

Чтобы еще немного поиграть с условиями, давайте напишем более содержательный код, который будет выдавать комментарий к оценке в 10-балльной шкале (оценка выше 7 – «отлично», выше 5 и ниже 8 – «хорошо», выше 3 и ниже 6 – «удовлетворительно», ниже 4 – «плохо».

Решение 1: несколько вложенных условий с оператором elif

In [8]:
grade = 7
if grade > 7:
    print("Отлично")
elif grade > 5:
    print("Хорошо")
elif grade > 3:
    print("Удовлетворительно")
else:
    print("Плохо")
Хорошо

Блок-схема для такого кода:

Решение 2: несколько сложных условий с if

In [9]:
grade = 7
if grade > 7:
    print("Отлично")
if (grade > 5) and (grade <= 7):
    print("Хорошо")
if (grade > 3) and (grade <= 5):
    print("Удовлетворительно")
if grade <= 3:
    print("Плохо")
Хорошо

Блок-схема для такого кода:

Могли бы мы использовать else вместо последнего условия с if? Давайте проверим!

In [10]:
grade = 7
if grade > 7:
    print("Отлично")
if (grade > 5) and (grade <= 7):
    print("Хорошо")
if (grade > 3) and (grade <= 5):
    print("Удовлетворительно")
else:
    print("Плохо")  # что-то пошло не так
Хорошо
Плохо

Почему получился такой странный результат? Потому что написанная часть с else относится не ко всем условиям с if выше, а только в последнему. Давайте посмотрим на блок-схему для такого кода: