Как программы принимают решения? Проверяют условия. Эти проверки — ключевая часть работы любой программы, будь то валидация пароля, реакция персонажа в игре на реплику, или изменение цвета кнопки в зависимости от результата в корзине. Условные инструкции позволяют программе реагировать на разные ситуации, делая её гибкой и умной.
По смыслу - вся работа ЭВМ построена на множестве условий (если вы смотрели видео про полупроводники, то вы примерно понимаете уже, о чем речь). Так что понимание условий - это основа понимания более сложных конструкций.
Большинство программ следуют линейному потоку выполнения — инструкции выполняются одна за другой. Однако во многих случаях требуется, чтобы программа выполняла определённые действия только при выполнении какого-то условия. Это называется ветвлением.
Пример из жизни:
Если идёт дождь, вы берёте зонт. Если дождя нет, зонта не берёте. Это ветвление: в зависимости от условия (дождь или нет) ваше действие меняется.
Прежде чем углубиться в условные инструкции, важно познакомиться с новым типом данных — bool.
Название происходит от булевой логики, предложенной математиком Джорджем Булем. В Python bool может иметь только два значения: True либо False (по сути Правда или Ложь).
С этим типом связана функция преобразования bool().
При этом 💡 обратите внимание, что преобразование любых пустых данных или нуля в результате даст False.
В остальных случаях это будет True.
Демонстрация работы функции bool и вывода
Тип данных bool играет центральную роль в проверке условий. Он является результатом выполнения логических операций, таких как сравнение чисел или проверка на равенство.
Условные инструкции позволяют создавать алгоритмы с ветвлением. Это алгоритмы, которые могут выполнять разные действия в зависимости от условий. Если условие истинно (True), выполняется одна часть кода, если ложно (False) — другая.
Соответственно выполнением условия будет булевое True, а его не выполнением – False.
Посмотрите на пример. В главе 0 описывался пример с роботом, в котором в зависимости от условий робот выполнял какие-то действия (или не выполнял).
Попробуйте описать через условия ваш день. Например: Если сегодня понедельник и 8 утра, то я встаю и иду на работу. Если нет – отдыхаю.
Если – то - это ключевые фразы для построения условий.
Попробуйте через условия описать также следующие механизмы:
Авторизацию пользователя на сайте/в приложении/в операционной систем/etc.
Доступ к контенту по подписке (например, boosty, netflix, youtube или аналогичные сервисы)
Покупка товара со скидкой
Работа таймера
Теперь давайте разберем, как составить условие.
Чтобы составить условие, используйте специальную команду-оператор if (в переводе если).
Такие команды, как if, создают блоки кода, которые выполняют какие-то действия. В данном случае, в зависимости от условий.
В некоторых языках для обозначения условия и блока исполняемого кода используют дополнительные символы. Вот так выглядит условие в JavaScript:
if ( условие ) { блок_кода };
Но в python это упростили. Так, начало условия также используют if, потом сразу пишут условие, а фигурные скобки заменили на двоеточие. Вот как это выглядит:
if условие:
блок_кода
В данном примере текст "Пункт отмечен" будет выведен на экран, так как is_checked = True.
💡Обратите внимание, что как и в случае с примером робота, для выполнения блока кода, следующим за if нужно, чтобы условие было в результате со значением True. В противном случае это условие не выполнится.
Создайте программу "registration.py"
Напишите программу, которая запрашивает логин пользователя. Сделайте проверку на то, что логин не пустой. Если это так, сделайте вывод: "Логин введён". Используйте для этого команду bool().
Обратили ли вы внимание на то, что код, после двоеточия, был написан с отступом?
В Python отступы – это способ разделения блоков кода на группы кода. Как правило, в python используют 1 TAB равный 4 пробелам. Не нужно их набирать на клавиатуре, если вдруг стерли отступ, просто нажмите 1 или несоклько раз TAB.
Редактор, как правило, сам устанавливает пробелы после знака :
При этом после каждого блока добавляйте дополнительный отступ. Если вы хотите под одним if написать еще один, то у второго будет двойной отступ для его кода и так далее. Такие условия называются вложенными условиями.
💡Примечание: можно ставить отступ и в 2 и в 5 пробелов, однако существует стандарт кода pep8. По нему указано, что стандартом является 4 пробела или 1 TAB == 4 пробелам. Большинство редакторов используют эти правила, так что, стоит продолжать их соблюдать. Не используйте разные отступы в программе – это сильно затрудняет чтение кода.
print('начало программы')
if условие1:
команда_1
команда_2
if условие 2:
команда_3
команда_4
команда_5
команда_6
команда_7
В этом примере команды 1, 2, 5 и 6 выполнятся только в случае выполнения условия1.
Команды 3 и 4 выполнятся только если выполнится условие2.
А команда 7 выполнится в любом случае, так как отступов уже нет и команда относится к основному коду программы, как и print в начале.
– А что, если я захочу создать переменную внутри условия?
– Никаких проблем, создавай. Есть ЯП, например JavaScript, в которых создание переменных внутри блоков приводит к тому, что эти созданные переменные можно использовать только в этом блоке if. Но python к ним не относится.
– А изменять переменные можно внутри if?
– Да, можно.
Надеюсь с тем, зачем нужны условия, вы разобрались. Но как непосредственно сравнить одно с другим? Например, что число больше другого числа, или пароли совпадают?
Для этого в естественном языке используются слова "больше", "меньше", "равно" и тд.
В языках программирования же нужно использовать специальные знаки – условные операторы.
Условные операторы полностью перекочевали из математики, так что думаю вы быстро вспомните, как они работают.
💡Обратите внимание, что в выражениях с равенством меняется первый знак.
Применение в коде
Результатом работы условного оператора (а также логического, речь о котором будет дальше) является булевые данные. Другими словами, все эти знаки выдают либо True либо False. Условные операторы также называют простыми, так как в них выполняется лишь одна логическая операция.
– А можно ли сравнить, например, число и строку?
– Ну, в некоторых языках можно. Но в python это вызовет ошибку сравнения. Сравнивать можно только одинаковые типы данных, но int и float тоже можно сравнивать.
Ранее было обозначенио, что разные типы данных проверять нельзя. Но как проверить, является ли переменная, например, строкой или эта строка - int? Попробуйте догадаться самостоятельно, попробуйте разные варианты проверок. Правильный ответ будет позже.
Создайте файл "conclusions.py"
Пользователь вводит 2 переменных целочисленного типа (x, y) и одну дробного (z). Вам нужно вывести следующие результаты сравнения:
Больше ли x, чем y
Меньше или равен z, округлённый через int, сумме x и y
Равен ли y нулю
Больше или равно произведение x на 2 и y на 3. Тоесть сравнить x умноженное на 2 и y умноженное на 3
Не равно ли z разности x и y
Не используйте конструкцию if в этом задании, сразу выводите через print.
Создайте файл "test_texts.py".
Сделайте проверки разных строк:
Hello
hello
Hello, world
Bye
Aye
Сделайте выводы всех сравнений. Посмотрите в особенности на одинаковые по длине (но различные по регистру) строки. Сделайте предположения, почему, нпаример, Bye больше чем Aye.
Полный ответ на это будет в теме про строки.
Продолжите работать в файле "registration.py"
Добавьте:
Переменную password, в которую пользователь вводит текст через input
Также логин и пароль в виде констант (помните ли вы, как оформлять такие переменные? Это было в главе про переменные)
Напишите проверки на логин и пароль. Сделайте так, чтобы пользователю сообщалось, корректный ли логин или пароль. Всего должно получиться 4 условия (по два на каждую проверку).
Блок If на самом деле не ограничивается одним if. В конструкции условий существует также еще два блока, которые тоже называются ветвлениями. Они нужны в тех случаях, когда вы хотите сделать группу из несокольких проверок.
elif (синтаксический сахар от else if)– команда, используемая в случаях, когда нужно добавить еще несколько ветвей (больше двух) в условную инструкцию. В отличии от команд if и else, может быть использована неоднократно в пределах одной условной инструкции. Наличие условия так же обязательно. Но в остальном работает также, как и if.
– Стоп. Что еще за синтаксический сахар?
– Синтаксический сахар – это специальные удобные способы записи кода, которые делают его проще и понятнее для чтения. Например elif – это сокращение от else if.
– Интересно! А есть ли другие записи синтаксического сахара?
– Да, их довольно много. Я оставлю пример кода с синтаксическим сахаром в переменных рядом. Но он присутствует не только в операциях записывания.
else – команда, которая нужна в тех случаях, когда нужно добавить "исключение". Иными словами, если ни одно условие не сработало. При этом для этой команды не нужно условия.
Обратите внимание на иллюстрацию.
На них четко показано, что у else нет проверок, если условие (if или все elif) не выполнилось, то программа автоматически переходит к else. Его невозможно избежать.
Посмотрите на программу слева. Это типичная проверка на несколько условий (оно не совершенно, такие проверки можно писать гораздо короче).
Обратите внимание, что блок начинается с одного if
Если условие не пройдено, программа начинает по очереди пробовать elif
И если ни одно условие не выполнилось, то программа
выполнит else.
Привожу пример, в котором elif не используется. Если у вас возник вопрос, почему не стоит начинать каждый раз с if – изучите эту программу. Создайте файл, перепишите код и запустите. Какой будет резальтат программы если ввести white? а red? А если что-то другое?
Проблема в этой программе в том, что если вы напишете white вы получите код этого цвета, все верно. Но вот что будет, если:
Напишете 'red' – вывдедется и код цвета и "Такого цвета нет"
Напишете что-то другое – выведется только "Такого цвета нет"
Это связано с тем, что python (как и остальные ЯП) воспринимают if как новое ветвление каждый раз, как встречает в процессе запуска. Elif помогает объединять несколько проверок в одну цепочку, что позволяет избежать нежелательного поведения.
Создайте файл "more_than_zero.py"
Пользователь вводит число (может быть и не целым). Нужно проверить его на то, является ли число положительным, отрицательным или нейтральным. Также нужно проверить, является ли число целым или не целым.
Примечание: сделайте так, чтобы проверка на целое/не целое запоминало результат, а не выводило сразу текст. Пример реализации можете посмотреть на скриншоте.
Продолжите работать в файле "registration.py"
Доработайте вашу программу таким образом, чтобы в ней использовались elif и else. Добавьте также несколько пар паролей и логинов.
Теперь давайте разбираться с логическими операторами (не путать с условными операторами!), и поговорим немного про погоду (да, вот так неожиданно).
Предположим, вы хотите одеться по погоде и решаете, что хотите надеть.
Чтобы не выбирать каждый раз, что надеть, вы решаете составить табличку, в которой указываете, например, температуру, а также светит солнце или нет (опустим непредсказуемость погоды)
Получилась небольшая табличка.
Из этой таблички видно, что:
Панама и легкая обувь будет надета только если И солнечно И на улице 20 и выше
Очки будут надеты, только если на улице НЕ облачно
А, например, футболка будет надета, если на улице ИЛИ солнечно, ИЛИ температура выше 20
В этом примере И, ИЛИ и НЕ – это логические операторы.
Оператор and – это строгий оператор. Чтобы всё условие выполнилось, нужно, чтобы части этого условия давали результат True.
temperature = 23
sun = True
if sun and temperature >= 20:
print('Надеть панаму и легкую обувь')
Зеленый кружок – результат выражения логиечкое True
Красный кружок – False
Оператор or – это не строгий оператор. Чтобы всё условие выполнилось, нужно, чтобы любая часть этого условия давала результат True.
temperature = 23
sun = True
if sun or temperature >= 20:
print('Надеть футболку')
Оператор not – это унарный оператор отрицания. Все, что стоит справа от оператора, будет инвертировано.
temperature = 23
cloud = False
if not cloud:
print('Надеть очки')
Кружочек справа – это результат выполнения
(not a), например: (not True) или (not False)
Вы можете писать несколько условий сразу и сочетать их между собой. Однако, нужно помнить следующе: and по приоритету работает также, как и умножение, а оператор or – все равно, что сложение. Используйте скобки, чтобы объединить сразу несколько выражений/условий.
В примере ниже должно выполниться либо условие, что температура выше 20 и не солнечно, либо температура должна быть ниже 20 и солнечно. Так вы можете составлять сложные условия и делать сразу несколько проверок для одного if. Однако, это не всегда стоит делать, если у вас предполагается разное поведение. В таком случае используйте вложенные условия, которые мы рассмотрели ранее.
Обратите внимание на знак слэша \ после or. Он нужен, чтобы переносить строку выражения, что может быть удобно для чтения кода. Без него переносить строчку нельзя - программа выдаст ошибку отступа.
Самый крутой лайфхак условий – это тернарные условия. Тернарные условия – это те же условия, только записанные в краткой форме.
Так, например, вы можете назначить результат переменной, не прибегая к громоздкой инструкции if-elif-else. Это полезно, если условие краткое или имеет только исключение.
Попробуйте написать такую програму, добавив, самостоятельно, print, чтобы вывести переменные is_cold, is_raind, season. Запустите и посмотрите, как будет выполняться программа.
Составьте полную программу "what_i_wear_today.py"
Придумайте собственные условия выбора одежды. Добавьте те, что есть в табличке выше. Можете придумать свои сочетания для выбора, поэкспериментируйте. Можете также предусмотреть сезонность (достаточно двух смежных, например весна и лето). Сделайте так, чтобы пользователь вводил данные о погоде.
С версии Python 3.10 в языке появился оператор match-case. Это мощный инструмент для организации множественного ветвления, напоминающий оператор switch из других языков. Однако match в Python выходит за рамки простого аналога switch, предоставляя больше возможностей.
Синтаксис оператора позволяет проверять значение переменной или выражения на соответствие одному из нескольких вариантов (веток case):
Ключевые слова match и case можно перевести как "соответствие случаю". Если значение переменной совпадает с указанным в ветке case, выполняются действия, вложенные в эту ветку.
Литералы вместо логических выражений
В отличие от if-elif, case принимает конкретное значение (литерал) или выражение, возвращающее однозначный результат. Использование сложных логических условий здесь недопустимо.
Ветка по умолчанию
Python не имеет прямого аналога ветки else. Вместо неё используется ветка case _ , которая срабатывает, если ни одна из веток case не подошла.
Несколько значений можно объединить с помощью оператора |. Если переменная соответствует хотя бы одному из значений, ветка будет выполнена.
Ответ к задачке: можно сделать проверку вида: type(5) == int