При изучении программирования в качестве практики часто приходится создавать «идеальные программы», которые в реальном мире работают совсем не так.
Иногда, например, нужно исполнить ряд инструкций только в том случае, если соблюдаются определенные условия. Для обработки таких ситуаций в языках программирования есть операторы управления. В дополнение к управлению потоком выполнения программы эти операторы используются для создания циклов или пропуска инструкций, когда какое-то условие истинно.
Операторы управления бывают следующих типов:
- Оператор-выражение if
- Оператор-выражение if-else
- Оператор-выражение if-elif-else
- Цикл while
- Цикл for
- Оператор-выражение break
- Оператор-выражение continue
В этом уроке речь пойдет о первых трех операторах управления.
Оператор if
Синтаксис оператора if следующий:
if condition:
<indented statement 1>
<indented statement 2>
<non-indented statement>
Первая строчка оператора, то есть if condition
: — это условие if, а condition
— это логическое выражение, которое возвращает True
или False
. В следующей строке блок инструкций. Блок представляет собой одну или больше инструкций. Если он идет следом за условием if, такой блок называют блоком if.
Стоит обратить внимание, что у каждой инструкции в блоке if одинаковый отступ от слова if. Многие языки, такие как C, C++, Java и PHP, используют фигурные скобки ({}
), чтобы определять начало и конец блока, но в Python используются отступы.
Каждая инструкция должна содержать одинаковое количество пробелов. В противном случае программа вернет синтаксическую ошибку. В документации Python рекомендуется делать отступ на 4 пробела. Такая рекомендация актуальная для и для этого .
Как это работает:
Когда выполняется инструкция if, проверяется условие. Если условие истинно, тогда все инструкции в блоке if выполняются. Но если условие оказывается неверным, тогда все инструкции внутри этого блока пропускаются.
Инструкции следом за условием if, у которых нет отступов, не относятся к блоку if. Например, <non-intenden statement>
— это не часть блока if, поэтому она будет выполнена в любом случае.
Например:
number = int(input("Введите число: "))
if number > 10:
print("Число больше 10")
Первый вывод:
Введите число: 100
Число больше 10
Второй вывод:
Введите число: 5
Стоит обратить внимание, что во втором случае, когда условие не истинно, инструкция внутри блока if пропускается. В этом примере блок if состоит из одной инструкции, но их может быть сколько угодно, главное — делать отступы.
Рассмотрим следующий код:
number = int(input("Введите число: "))
if number > 10:
print("первая строка")
print("вторая строка")
print("третья строка")
print("Выполняется каждый раз, когда вы запускаете программу")
print("Конец")
Первый вывод:
Введите число: 45
первая строка
вторая строка
третья строка
Выполняется каждый раз, когда вы запускаете программу
Конец
Второй вывод:
Введите число: 4
Выполняется каждый раз, когда вы запускаете программу
Конец
Здесь важно обратить внимание, что только выражения на строках 3, 4 и 5 относятся к блоку if. Следовательно, они будут исполнены только в том случае, когда условие if будет истинно. Но инструкции на строках 7 и 8 выполнятся в любом случае.
Консоль Python реагирует иначе при использовании операторов управления прямо в ней. Стоит напомнить, что для разбития выражения на несколько строк используется оператор продолжение (\
). Но в этом нет необходимости с операторами управления. Интерпретатор Python автоматически активирует мультистрочный режим, если нажать Enter после условия if. Например:
>>>
>>> n = 100
>>> if n > 10:
...
После нажатия Enter на строке с условием if командная строка преобразуется с >>>
на …
. Консоль Python показывает …
для многострочных инструкций. Это значит, что начатая инструкция все еще не закончена.
Чтобы закончить инструкцию if, нужно добавить еще одну инструкцию в блок if:
>>>
>>> n = 100
>>> if n > 10:
... print("n v 10")
...
Python не будет автоматически добавлять отступ. Это нужно сделать самостоятельно. Закончив ввод инструкции, нужно дважды нажать Enter, чтобы исполнить инструкцию. После этого консоль вернется к изначальному состоянию.
>>>
>>> n = 100
>>> if n > 10:
... print("n больше чем 10")
...
n больше чем 10
>>>
Все эти программы заканчиваются внезапно, не показывая ничего, если условие не истинно. Но в большинстве случаев пользователю нужно показать хотя бы что-нибудь. Для этого используется оператор-выражение if-else.
Оператор if-else
Оператор if-else исполняет одну порцию инструкций, если условие истинно и другое — если нет. Таким образом этот оператор предлагает два направления действий. Синтаксис оператора if-else следующий:
if condition:
# блок if
statement 1
statement 2
and so on
else:
# блок else
statement 3
statement 4
and so on:
Как это работает:
Когда оператор if-else исполняется, условие проверяется, и если оно возвращает True
, когда инструкции в блоке if исполняются. Но если возвращается False
, тогда исполняются инструкции из блока else.
Пример 1: программа для расчета площади и длины окружности круга.
radius = int(input("Введите радиус: "))
if radius >= 0:
print("Длина окружности = ", 2 * 3.14 * radius)
print("Площадь = ", 3.14 * radius ** 2)
else:
print("Пожалуйста, введите положительное число")
Первый вывод:
Введите радиус: 4
Длина окружности = 25.12
Площадь = 50.24
Второй вывод:
Введите радиус: -12
Пожалуйста, введите положительное число
Теперь программа показывает корректный ответ пользователю, даже если условие if не является истинным. Это и требуется.
В инструкциях if-else нужно следить за тем, чтобы условия if и else находились на одном уровне. В противном случае программа вернет синтаксическую ошибку. Например:
radius = int(input("Введите радиус: "))
if radius >= 0:
print("Длина окружности = ", 2 * 3.14 * radius)
print("Площадь = ", 3.14 * radius ** 2)
else:
print("Пожалуйста, введите положительное число")
Если попробовать запустить эту программу, то появится следующая ошибка:
$ python3 if_and_else_not_aligned.py
File "if_and_else_not_aligned.py", line 6
else:
^
SyntaxError: invalid syntax
$
Для исправления проблемы нужно вертикально выровнять if и else
Другой пример:
Пример 2: программа для проверки пароля, введенного пользователем.
password = input("Введите пароль: ")
if password == "sshh":
print("Добро пожаловать")
else:
print("Доступ запрещен")
Первый вывод:
Введите пароль: sshh
Добро пожаловать
Второй вывод:
Введите пароль: abc
Доступ запрещен
Вложенные операторы if и if-else
Использовать операторы if-else можно внутри других инструкций if или if-else. Это лучше объяснить на примерах:
Оператор if внутри другого if-оператора
Пример 1: программа, проверяющая, имеет ли студент право на кредит.
gre_score = int(input("Введите текущий лимит: "))
per_grad = int(input("Введите кредитный рейтинг: "))
if per_grad > 70:
# внешний блок if
if gre_score > 150:
# внутренний блок if
print("Поздравляем, вам выдан кредит")
else:
print("Извините, вы не имеете права на кредит")
Здесь оператор if используется внутри другого if-оператора. Внутренним называют вложенный оператором if. В этом случае внутренний оператор if относится к внешнему блоку if, а у внутреннего блока if есть только одна инструкция, которая выводит “Поздравляем, вам выдан кредит”.
Как это работает:
Сначала оценивается внешнее условие if, то есть per_grad > 70
. Если оно возвращает True
, тогда управление программой происходит внутри внешнего блока if. Там же проверяется условие gre_score > 150
. Если оно возвращает True
, тогда в консоль выводится "Congratulations you are eligible for loan"
. Если False
, тогда программа выходит из инструкции if-else, чтобы исполнить следующие операции. Ничего при этом не выводится в консоль.
При этом если внешнее условие возвращает False
, тогда выполнение инструкций внутри блока if пропускается, и контроль переходит к блоку else (9 строчка).
Первый вывод:
Введите текущий лимит: 160
Введите кредитный рейтинг: 75
Поздравляем, вам выдан кредит
Второй вывод:
Введите текущий лимит: 160
Введите кредитный рейтинг: 60
Извините, вы не имеете права на кредит
У этой программы есть одна маленькая проблема. Запустите ее заново и введите gre_score
меньше чем 150
, а per_grade
— больше 70
:
Вывод:
Введите текущий лимит: 140
Введите кредитный рейтинг: 80
Программа не выводит ничего. Причина в том, что у вложенного оператора if нет условия else. Добавим его в следующем примере.
Пример 2: инструкция if-else внутри другого оператора if.
gre_score = int(input("Введите текущий лимит: "))
per_grad = int(input("Введите кредитный рейтинг: "))
if per_grad > 70:
if gre_score > 150:
print("Поздравляем, вам выдан кредит")
else:
print("У вас низкий кредитный лимит")
else:
print("Извините, вы не имеете права на кредит")
Вывод:
Введите текущий лимит: 140
Введите кредитный рейтинг: 80
У вас низкий кредитный лимит
Как это работает:
Эта программа работает та же, как и предыдущая. Единственное отличие — у вложенного оператора if теперь есть инструкция else. Теперь если ввести балл GRE меньше, чем 150, программа выведет: “У вас низкий кредитный лимит”
При создании вложенных операторов if или if-else, всегда важно помнить об отступах. В противном случае выйдет синтаксическая ошибка.
Оператор if-else внутри условия else
Пример 3: программа для определения оценки студента на основе введенных баллов.
score = int(input("Введите вашу оценку: "))
if score >= 90:
print("Отлично! Ваша оценка А")
else:
if score >= 80:
print("Здорово! Ваша оценка - B")
else:
if score >= 70:
print("Хорошо! Ваша оценка - C")
else:
if score >= 60:
print("Ваша оценка - D. Стоит повторить материал.")
else:
print("Вы не сдали экзамен")
Первый вывод:
Введите вашу оценку: 92
Отлично! Ваша оценка А
Второй вывод:
Введите вашу оценку: 72
Хорошо! Ваша оценка - C
Третий вывод:
Введите вашу оценку: 56
Вы не сдали экзамен
Как это работает:
Когда управление программой переходит к оператору if-else, проверяется условие на строке 3 (score >= 90
). Если оно возвращает True
, в консоль выводится “Отлично! Ваша оценка А”. Если значение неверное, управление переходит к условию else
на 5 строке. Теперь проверяется условие score >= 80
(6 строка). Если оно верное, тогда в консоли выводится “Здорово! Ваша оценка — B”.
В противном случае управление программой переходит к условию else
на 8 строке. И здесь снова имеется вложенный оператор if-else. Проверяется условие (score >= 70
). Если оно истинно, тогда в консоль выводится “Хорошо! Ваша оценка — C”. В противном случае управление переходит к блоку else
на 11 строке. В конце концов, проверяется условие (score >= 60
). Если оно возвращает True
, тогда в консоль выводится “Ваша оценка — D. Стоит повторить материал.” Если же False
, тогда в консоли будет “Вы не сдали экзамен”. На этом этапе управление переходит к следующим инструкциям, написанным после внешнего if-else.
Хотя вложенные операторы if-else позволяют проверять несколько условий, их довольно сложно читать и писать. Эти же программы можно сделать более читабельными и простыми с помощью if-elif-else.
Оператор if-elif-else
Оператор if-elif-else — это альтернативное представление оператора if-else, которое позволяет проверять несколько условий, вместо того чтобы писать вложенные if-else. Синтаксис этого оператора следующий:
if condition_1:
# блок if
statement
statement
more statement
elif condition_2:
# первый блок elif
statement
statement
more statement
elif condition_3:
# второй блок elif
statement
statement
more statement
...
else
statement
statement
more statement
Примечание: …
означает, что можно писать сколько угодно условий eilf
.
Как это работает:
Когда исполняется инструкция if-elif-else, в первую очередь проверяется condition_1
. Если условие истинно, тогда исполняется блок инструкций if. Следующие условия и инструкции пропускаются, и управление переходит к операторам вне if-elif-else.
Если condition_1
оказывается ложным, тогда управление переходит к следующему условию elif
, и проверяется condition_2
. Если оно истинно, тогда исполняются инструкции внутри первого блока elif
. Последующие инструкции внутри этого блока пропускаются.
Этот процесс повторяется, пока не находится условие elif
, которое оказывается истинным. Если такого нет, тогда исполняется блок else в самом конце.
Перепишем программу с помощью if-elif-else.
score = int(input("Введите вашу оценку: "))
if score >= 90:
print("Отлично! Ваша оценка А")
elif score >= 80:
print("Здорово! Ваша оценка - B")
elif score >= 70:
print("Хорошо! Ваша оценка - C")
elif score >= 60:
print("Ваша оценка - D. Стоит повторить материал.")
else:
print("Вы не сдали экзамен")
Первый вывод:
Введите вашу оценку: 78
Хорошо! Ваша оценка - C
Второй вывод:
Введите вашу оценку: 91
Отлично! Ваша оценка А
Третий вывод:
Введите вашу оценку: 55
Вы не сдали экзамен
Такую программу намного легче читать, чем в случае с вложенными if-else.