Цикл if else в питоне

При изучении программирования в качестве практики часто приходится создавать «идеальные программы», которые в реальном мире работают совсем не так.
Иногда, например, нужно исполнить ряд инструкций только в том случае, если соблюдаются определенные условия. Для обработки таких ситуаций в языках программирования есть операторы управления. В дополнение к управлению потоком выполнения программы эти операторы используются для создания циклов или пропуска инструкций, когда какое-то условие истинно.
Операторы управления бывают следующих типов:
- Оператор-выражение if
- Оператор-выражение if-else
- Оператор-выражение if-elif-else
- Цикл while
- Цикл for
- Оператор-выражение break
- Оператор-выражение continue
В этом уроке речь пойдет о первых трех операторах управления.
Оператор if
Синтаксис оператора if следующий:
if condition: <indented ement 1> <indented ement 2> <non-indented ement>
Первая строчка оператора, то есть if condition: – это условие if, а condition – это логическое выражение, которое возвращает True или False. В следующей строке блок инструкций. Блок представляет собой одну или больше инструкций. Если он идет следом за условием if, такой блок называют блоком if.
Стоит обратить внимание, что у каждой инструкции в блоке if одинаковый отступ от слова if. Многие языки, такие как C, C++, Java и PHP, используют фигурные скобки ({}), чтобы определять начало и конец блока, но в Python используются отступы.
Каждая инструкция должна содержать одинаковое количество пробелов. В противном случае программа вернет синтаксическую ошибку. В документации Python рекомендуется делать отступ на 4 пробела. Такая рекомендация актуальная для и для этого .
Как это работает:
Когда выполняется инструкция if, проверяется условие. Если условие истинно, тогда все инструкции в блоке if выполняются. Но если условие оказывается неверным, тогда все инструкции внутри этого блока пропускаются.
Инструкции следом за условием if, у которых нет отступов, не относятся к блоку if. Например, <non-intenden ement> – это не часть блока if, поэтому она будет выполнена в любом случае.
Например:
number = int(input(“Введите число: “)) if number > 10: (“Число больше 10”)
Первый вывод:
Введите число: 100 Число больше 10
Второй вывод:
Введите число: 5
Стоит обратить внимание, что во втором случае, когда условие не истинно, инструкция внутри блока if пропускается. В этом примере блок if состоит из одной инструкции, но их может быть сколько угодно, главное – делать отступы.
Рассмотрим следующий код:
number = int(input(“Введите число: “)) if number > 10: (“первая строка”) (“вторая строка”) (“третья строка”) (“Выполняется каждый раз, когда вы запускаете программу”) (“Конец”)
Первый вывод:
Введите число: 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: … (“n v 10”) …
Python не будет автоматически добавлять отступ. Это нужно сделать самостоятельно. Закончив ввод инструкции, нужно дважды нажать Enter, чтобы исполнить инструкцию. После этого консоль вернется к изначальному состоянию.
>>> >>> n = 100 >>> if n > 10: … (“n больше чем 10”) … n больше чем 10 >>>
Все эти программы заканчиваются внезапно, не показывая ничего, если условие не истинно. Но в большинстве случаев пользователю нужно показать хотя бы что-нибудь. Для этого используется оператор-выражение if-else.
Оператор if-else
Оператор if-else исполняет одну порцию инструкций, если условие истинно и другое – если нет. Таким образом этот оператор предлагает два направления действий. Синтаксис оператора if-else следующий:
if condition: ement 1 ement 2 and so on else: ement 3 ement 4 and so on:
Как это работает:
Когда оператор if-else исполняется, условие проверяется, и если оно возвращает True, когда инструкции в блоке if исполняются. Но если возвращается False, тогда исполняются инструкции из блока else.
Пример 1: программа для расчета площади и длины окружности круга.
radius = int(input(“Введите радиус: “)) if radius >= 0: (“Длина окружности = “, 2 * 3.14 * radius) (“Площадь = “, 3.14 * radius ** 2) else: (“Пожалуйста, введите положительное число”)
Первый вывод:
Введите радиус: 4 Длина окружности = 25.12 Площадь = 50.24
Второй вывод:
Введите радиус: -12 Пожалуйста, введите положительное число
Теперь программа показывает корректный ответ пользователю, даже если условие if не является истинным. Это и требуется.
В инструкциях if-else нужно следить за тем, чтобы условия if и else находились на одном уровне. В противном случае программа вернет синтаксическую ошибку. Например:
radius = int(input(“Введите радиус: “)) if radius >= 0: (“Длина окружности = “, 2 * 3.14 * radius) (“Площадь = “, 3.14 * radius ** 2) else: (“Пожалуйста, введите положительное число”)
Если попробовать запустить эту программу, то появится следующая ошибка:
$ 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”: (“Добро пожаловать”) else: (“Доступ запрещен”)
Первый вывод:
Введите пароль: 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 gre_score > 150: (“Поздравляем, вам выдан кредит”) else: (“Извините, вы не имеете права на кредит”)
Здесь оператор 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: (“Поздравляем, вам выдан кредит”) else: (“У вас низкий кредитный лимит”) else: (“Извините, вы не имеете права на кредит”)
Вывод:
Введите текущий лимит: 140 Введите кредитный рейтинг: 80 У вас низкий кредитный лимит
Как это работает:
Эта программа работает та же, как и предыдущая. Единственное отличие – у вложенного оператора if теперь есть инструкция else. Теперь если ввести балл GRE меньше, чем 150, программа выведет: “У вас низкий кредитный лимит”
При создании вложенных операторов if или if-else, всегда важно помнить об отступах. В противном случае выйдет синтаксическая ошибка.
Оператор if-else внутри условия else
Пример 3: программа для определения оценки студента на основе введенных баллов.
score = int(input(“Введите вашу оценку: “)) if score >= 90: (“Отлично! Ваша оценка А”) else: if score >= 80: (“Здорово! Ваша оценка – B”) else: if score >= 70: (“Хорошо! Ваша оценка – C”) else: if score >= 60: (“Ваша оценка – D. Стоит повторить материал.”) else: (“Вы не сдали экзамен”)
Первый вывод:
Введите вашу оценку: 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: ement ement more ement elif condition_2: ement ement more ement elif condition_3: ement ement more ement … else ement ement more ement
Примечание: … означает, что можно писать сколько угодно условий 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: (“Отлично! Ваша оценка А”) elif score >= 80: (“Здорово! Ваша оценка – B”) elif score >= 70: (“Хорошо! Ваша оценка – C”) elif score >= 60: (“Ваша оценка – D. Стоит повторить материал.”) else: (“Вы не сдали экзамен”)
Первый вывод:
Введите вашу оценку: 78 Хорошо! Ваша оценка – C
Второй вывод:
Введите вашу оценку: 91 Отлично! Ваша оценка А
Третий вывод:
Введите вашу оценку: 55 Вы не сдали экзамен
Такую программу намного легче читать, чем в случае с вложенными if-else.
Источник
Зачем нужны условные инструкции
Фундаментальная важность условий для любого из языков программирования заключается в их возможности описывать большую часть логики работы программы.
Говоря простыми словами, конструкция if else в Python указывает интерпретатору, следует ли выполнять определенный участок кода или нет.
Как и все прочие составные инструкции языка, оператор выбора также поддерживает свойство вложенности. Это означает, что использование if else позволяет создавать внутри программного модуля так называемое логическое ветвление.
Как работает if else
Синтаксис
Оператор if else в языке Python – это типичная условная конструкция, которую можно встретить и в большинстве других языков программирования.
# самый простой пример, где есть всего одно условие a = 1 if a == 1: (“It is true”) > It is true
Синтаксически конструкция выглядит следующим образом:
- сначала записывается часть if с условным выражением, которое возвращает истину или ложь;
- затем может следовать одна или несколько необязательных частей elif (в других языках вы могли встречать else if);
- Завершается же запись этого составного оператора также необязательной частью else.
Принцип работы оператора выбора в Python
count = 1 # условное выражение может быть сколь угодно сложным, # и может быть сколь угодно много elif-частей if True and count == 1 and count == 2: (“if”) elif count == ‘count’: (“First elif”) elif count == 14.2: (“Second elif”) elif count == 1: (“Nth elif”) else: (“Else”) > Nth elif
Для каждой из частей существует ассоциированный с ней блок инструкций, которые выполняются в случае истинности соответствующего им условного выражения.
b = 10 if b == 10: # любое количество инструкций (b) b = b * 15 b = b – 43 b = b ** 0.5 (b) elif b == 20: (“You will not see me”) else: (“And me”) > 10 > 10.344080432788601
То есть интерпретатор начинает последовательное выполнение программы, доходит до if и вычисляет значение сопутствующего условного выражения. Если условие истинно, то выполняется связанный с if набор инструкций. После этого управление передается следующему участку кода, а все последующие части elif и часть else (если они присутствуют) опускаются.
Отступы
Отступы – важная и показательная часть языка Python. Их смысл интуитивно понятен, а определить их можно, как размер или ширину пустого пространства слева от начала программного кода.
# начало кода # код # код # код # начало первого отступа # первый отступ # первый отступ # начало второго отступа # второй отступ # второй отступ # конец второго отступа # конец первого отступа
Благодаря отступам, python-интерпретатор определяет границы блоков. Все последовательно записанные инструкции, чье смещение вправо одинаково, принадлежат к одному и тому же блоку кода. Конец блока совпадает либо с концом всего файла, либо соответствует такой инструкции, которая предшествует следующей строке кода с меньшим отступом.
var_a = 5 var_b = 10 var_c = 20 if var_c**2 > var_a * var_b: # блок №1 if var_c < 100: # блок №2 if var_c > 10: # блок №3 var_a = var_a * var_b * var_c # блок №2 var_b = var_a + var_c # блок №1 var_c = var_a – var_b (var_a) (var_b) (var_c) > 1000 > 1020 > -20
Таким образом, с помощью отступов появляется возможность создавать блоки на различной глубине вложенности, следуя простому принципу: чем глубже блок, тем шире отступ.
Подробнее о табуляции и отступах в Python читайте в нашей статье – Python табуляция (отступы).
Примеры
Рассмотрим несколько практических примеров использования условного оператора.
Пример №1: создание ежедневного бэкапа (например базы данных):
from import def daily_backup(last_backup_): “”” Передаем дату последнего бэкапа. Если прошло больше 1 дня, создаем бэкап “”” if not last_backup_: (f”creating first backup [{.now().()}] ..”) return delta = .now() – last_backup_ if delta.days > 0: (f”creating backup [{.now().()}] ..”) else: (f”backup on [{.now().()}] already exists”) daily_backup(“”) > creating first backup [2020-08-15] .. daily_backup((2020, 8, 14)) > creating backup [2020-08-15] .. daily_backup((2020, 8, 15)) > backup on [2020-08-15] already exists
Пример №2: Проверка доступа пользователя к системе. В данном примере if проверяет наличие элемента в списке:
BLACK_LIST = [‘192.34.12.3’, ‘192.34.12.5’, ‘192.34.10.23’] USERS = [‘rolli34’, ‘constantinpetrovv’, ‘kate901’] def access_available(user_name, ip): if user_name in USERS: if ip not in BLACK_LIST: return True else: (f”write to log: user {user_name} [ip: {ip}] in block list”) else: (f”write to log: user {user_name} [ip: {ip}] does not exists”) return False if access_available(“rolli34”, “192.34.12.111”): (f”Hello!!”) > Hello!! if access_available(“rolli34”, “192.34.10.23”): (f”Hello!!”) > write to log: user rolli34 [ip: 192.34.10.23] in block list if access_available(“devnull”, “192.34.10.11”): (f”Hello!!”) > write to log: user devnull [ip: 192.34.10.11] does not exists
Пример №3: Валидация входных данных. В примере к нам приходят данные в формате json. Нам необходимо выбрать все записи определенного формата:
NEED = { “name”: str, “weight”: int, “age”: int, } def is_valid(data): valid = True for need_key_name, need_type in NEED.items(): # проверяем наличие ключа if need_key_name in data: # если ключ есть, проверяем тип значения data_type = type(data[need_key_name]) if data_type != need_type: (f”type error: ‘{need_key_name}’ is {data_type}, need: {need_type}”) valid = False else: (f”key error: ‘{need_key_name}’ does not exists”) valid = False return valid if is_valid({“name”: “Alex”}): (“data is valid”) > key error: ‘weight’ does not exists key error: ‘age’ does not exists if is_valid({“name”: “Alex”, “age”: “18”}): (“data is valid”) > key error: ‘weight’ does not exists type error: ‘age’ is <class ‘str’>, need: <class ‘int’> if is_valid({“name”: “Alex”, “weight”: 60, “age”: 18}): (“data is valid”) > data is valid
Оператор elif
elif позволяет программе выбирать из нескольких вариантов. Это удобно, например, в том случае, если одну переменную необходимо многократно сравнить с разными величинами.
shinobi = ‘Naruto’ if shinobi == ‘Orochimaru’: (‘fushi tensei’) elif shinobi == ‘Naruto’: (‘RASENGAN’) elif shinobi == ‘Sasuke’: (‘chidori’) > RASENGAN
Такая конструкция может содержать сколь угодно большую последовательность условий, которые интерпретатор будет по порядку проверять.
Но помните, что первое условие всегда задается с if
Также не стоит забывать, что как только очередное условие в операторе оказывается истинным, программа выполняет соответствующий блок инструкций, а после переходит к следующему выражению.
Из этого вытекает, что даже если несколько условий истинны, то исполнению подлежит все равно максимум один, первый по порядку, блок кода с истинным условием.
Если ни одно из условий для частей if и elif не выполняется, то срабатывает заключительный блок под оператором еlse (если он существует).
Заглушка pass
Оператор-заглушка pass заменяет собой отсутствие какой-либо операции.
Он может быть весьма полезен в случае, когда в ветвлении встречается много elif-частей, и для определенных условий не требуется выполнять никакой обработки.
Наличие тела инструкции в Python обязательно
sum = 100000 account_first = 12000 account_second = 360000 if account_first > sum: pass elif account_second > sum: pass else: (sum)
if else в одну строку
Во многих языках программирования условие может быть записано в одну строку. Например, в JavaScript используется тернарный оператор:
# так выглядит условие в одну строку в JavaScript const accessAllowed = (age > 21) ? true : false;
Читается это выражение так: если age больше 21, accessAllowed равен true, иначе – accessAllowed равен false.
В Python отсутствует тернарный оператор
Вместо тернарного оператора, в Питоне используют инструкцию if else, записанную в виде выражения (в одно строку):
<expression if True> if <predicate> else <expression if False>
Пример:
number = -10 abs_number = number if number >= 0 else -number (abs_number)
Такая конструкция может показаться сложной, поэтому для простоты восприятия, нужно поделить ее на 3 блока:
Для простоты восприятия if-else, записанного одной строкой, разделите выражение на 3 блока
Стоит ли использовать такой синтаксис? Если пример простой, то однозначно да:
# полная версия count = 3 if count < 100: my_number = count else: my_number = 100 # сокращенная версия count = 3 my_number = count if count < 100 else 100
Вполне читаемо смотрятся и следующие 2 примера:
x = “Kate” if “Alex” in “My name is Alex” else “Mary” (x) > Kate y = 43 if 42 in range(100) else 21 (y) > 43
Но если вы используете несколько условий, сокращенная конструкция усложняется и становится менее читаемой:
x = 10 result = 100 if x > 42 else 42 if x == 42 else 0 (result) > 0
Вложенные условия
Ограничений для уровней вложенности в Pyhton не предусмотрено, а регулируются они все теми же отступами:
# делать код менее читаемым можно до бесконечности def run(action): if action: (some_func()) else: if some_func(): num = one_func() if num: if 0 < num < 100: (num) else: (‘-‘)
Стоит ли использовать такие вложенности? Скорее нет, чем да. Одно из положений Python Zen гласит:
Flat is better than nested (развернутое лучше вложенного).
Большая вложенность имеет следующие недостатки:
- становится трудно легко найти, где заканчивается конкретный блок;
- код становится менее читаемым и сложным для понимания;
- возможно придется прокручивать окно редактора по горизонтали.
Но что делать, если в скрипте не получается уйти от большой вложенности if-else? ????♂️
Чтобы уйти от большой вложенности, попробуйте не использовать оператор else
Пример выше, можно записать следующим образом:
def run(action): if action: (some_func()) return if not some_func(): return num = one_func() if not num: return if 0 < num < 100: (num) return (‘-‘)
Конструкция switch case
В Python отсутствует инструкция switch case
В языках, где такая инструкция есть, она позволяет заменить собой несколько условий if и более наглядно выразить сравнение с несколькими вариантами.
# пример на C++ int main() { int n = 5; # сравниваем значение n поочередно со значениями case-ов switch (n) { case 1: cout << n; break; case 2: cout << n; break; # так как 5 не равняется ни 1-у, ни 2-м, то выполняется блок default default: cout << “There is no your number”; break; } return 0; } > There is no your number
Свято место пусто не бывает, поэтому в питоне такое множественное ветвление, в обычном случае, выглядит как последовательность проверок if-elif:
n = 5 if n == 1: (n) elif n == 2: (n) else: (“There is no your number”) > “There is no your number”
Однако есть и более экзотический вариант реализации этой конструкции, задействующий в основе своей python-словари:
number = 1 switch_dict = { 1: 1, 2: 2, 3: 3, } (switch_dict.get(number, “There is no your number”)) > “There is no your number”
Использование словарей позволяет, в качестве значений, хранить вызовы функций, тем самым, делая эту конструкцию весьма и весьма мощной и гибкой.
Источник