УСЛО­ВИЯ



С условиями в жизни каждый из нас сталкивается постоянно. Условие можно охарактеризовать следующим образом: если происходит какое-то событие, то мы реагируем на него определённым образом.

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

Словно на развилке дорог выбрать, куда пойти: направо или налево.

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

Проверяемая в данном примере информация является "характеристикой" дня недели - выходной или нет. При этом, заметьте, событие (день начался) должно произойти и стать актуальным. Проверять назавтра, был ли вчера выходной, чтобы "вчера" ехать кататься на велосипедах бессмысленно, ведь поехать покататься "вчера" на велосипеде мы не сможем. Отсюда вывод: проверяемая информация должна быть актуальной.

Ещё один пример: если бабушка зовёт кушать, то мы идём кушать. Или не идём. Всё зависит от степени голода, еды и бабушки. То же самое и в программировании: если что-то произошло, если какая-то информация становится верной, то мы выполняем определённые действия. Если не произошло - то программа игнорит, не выполняя никаких команд.

В программировании проверка с помощью условия осуществляется уже имеющего место быть события (или информации), которое можно достоверно проконтролировать.

Пример с велосипедом можно записать приближенным к синтаксису Python образом:

Наступил новый день Если СЕГОДНЯ ВЫХОДНОЙ: Едем кататься на велосипеде

Помните тип переменных bool (логический)? Он может принимать значения True (истина) или False (ложь). Логический тип играет важную роль в условиях, если подзабыли, то для начала рекомендую прочесть главу "Типы данных".

По логике следует, что утверждение "СЕГОДНЯ ВЫХОДНОЙ" будет истинно в любой выходной день, ложно - в любой другой. В первом случае мы можем пометить:

СЕГОДНЯ ВЫХОДНОЙ = True

Для любого другого дня так:

СЕГОДНЯ ВЫХОДНОЙ = False

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


ВЫСКА­ЗЫВАНИЕ


"СЕГОДНЯ ВЫХОДНОЙ" - это высказывание. Потому что мы можем подтвердить (True) или опровергнуть (False) это утверждение.

Подчеркну, что требуется определённая точность в реакции на высказывания. В случае, когда мы имеем дело с высказываниями, мы должны запретить себе любые другие реакции, кроме как "да" или "нет". Никаких "вероятно выходной", "возможно выходной", "ах, ну не знаю" или "ой, всё!"

Если выходной, то да, мы уверены! Жёсткое волевое "ДА"! Подтверждаем! Тогда:

СЕГОДНЯ ВЫХОДНОЙ = True

Если будний день, то не менее уверенно утверждаем:

СЕГОДНЯ ВЫХОДНОЙ = False

Третьего не дано и не может быть дано.

Проверка дня, который "сегодня", - это событие. И оно обязано наступить перед тем, как мы его будем проверять. Логично? Логично! Когда в программе станете использовать условные конструкции, то не забывайте последовательность: то, что мы проверяем, должно "произойти". Чаще всего это будет проверка каких-то значений, и эти проверяемые значения должны существовать до условия, а не появляться после.

Но вернёмся к высказыванию.

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

Высказываниями не являются вопросительные предложения, требующие развёрнутого ответа, например, "Сколько сейчас времени?"; побудительные предложения, например, "Пойдём в кино!", а также предложения, на которые нет однозначного ответа. Например, когда на улице льёт дождь, утверждение "Сегодня хорошая погода" невозможно назвать объективным высказыванием, потому что тот, кому нравится дождь, скажет "Да!", другие ответят - "Нет!"

Также высказыванием является утверждение "Париж - столица Москвы". Почему?

Потому что от нас не требуется проверять, столицей чего является (и является ли) Париж. Нам главное подтвердить или опровергнуть "столичность" Парижа относительно Москвы. А это, простите за выражение, ахинея. Поэтому смело говорим "Это ложь", тем самым подтверждая, что представленное утверждение является высказыванием.

Выражение СЕГОДНЯ ВЫХОДНОЙ является высказыванием.

А высказывание "Выражение СЕГОДНЯ ВЫХОДНОЙ является высказыванием" - истинно.


КАК ЗАПИ­САТЬ УСЛО­ВИЕ


Если написать наше условие с выходным, используя синтаксис Python, то выглядеть будет так:

если СЕГОДНЯ ВЫХОДНОЙ: Едем кататься на велосипеде

Правило гласит:

Если логическое высказывание истинно, то будет выполнена команда (или блок команд), указанный после двоеточия.

Получается так, что когда высказывание "СЕГОДНЯ ВЫХОДНОЙ" принимает значение истина, выполняется команда "Едем кататься на велосипеде".

На языке Python условие записывается оператором if. Смело читайте не "иф", а "если", так будет понятней. Общий вид конструкции такой:

if (логическое высказывание): Блок команд

Блок команд - одна или более команд на языке Python, записанных с отступом ровно в четыре пробела от символа i оператора if.

Если команды в блоке записать на расстоянии в 3 или 5 пробелов, то Python выдаст ошибку. Если команды записать без отступа, то они будут считаться не относящимися к блоку и не будут выполняться в условии.

Пример блока команд:

if (логическое высказывание): print("Это первая команда блока") print("Это вторая команда блока") print("А тут я вообще дурачусь!")

Логическое высказывание - записанное по правилам языка Python выражение, результатом которого может быть True или False. Такие выражения получаются в результате работы операторов >, <, >=, <=, !=, ==. Подробнее можно посмотреть в таблице в разделе логических переменных "bool", глава "Типы данных".

Когда "логическое высказывание" будет истинным, выполнится блок из трёх последовательно идущих команд print(). Для тестирования программы вы можете записать:

if (True): print("Это первая команда блока") print("Это вторая команда блока") print("А тут я вообще дурачусь!")

Наберите программу, сохраните и нажмите F5 для запуска. Python выведет три указанные строки на экран.

Измените True на False и вновь запустите программу. Что-то появилось на экране? Нет. Так как в скобках у нас указано False, то есть ложь, Python не станет выполнять команду print(). Просто проигнорит. (Бан, пошёл вон из друзей за игнор, глупый Python!)

Логический оператор if (читаем - "если") относится к блоку обработки данных. Задача оператора: проконтролировать (сравнить) данные, то есть обработать их, и направить выполнение программы по тому или иному пути, "разветвить" алгоритм, создать "две дороги" в выполнении. Например, в главном окне CS:GO существует условие:

if (НАЖАТ ЗНАЧОК ВЫХОДА): Выйти из программы в Windows

Когда условие срабатывает, то есть высказывание "НАЖАТ ЗНАЧОК ВЫХОДА" становится True, CS:GO прекращает работу.


ПРОГ­РАММА "ВЫХОД­НОЙ?"


Вернёмся к велосипедам и выходным. Рассуждаем. Компьютер сам по себе не может проверить, является ли сегодняшний день выходным. Для него вообще отсутствует понятие "рабочего", "выходного" или "праздничного" дня.

Для проверки нам нужно что-то конкретное, например, номер дня. Ведь мы гарантированно знаем, что седьмой день (воскресение) - выходной! То есть:

if (СЕГОДНЯШНИЙ ДЕНЬ == 7): Едем кататься на велосипеде

Напоминаю, оператор == сравнивает два значения и в случае их идентичности результатом сравнения будет True.

Итак, следим за тем, чтобы в нашей программе было как минимум по одной команде каждого блока "Ввод данных - обработка данных - вывод данных" и проектируем алгоритм. Предлагаю следующий вариант:

  1. Посредством int(input()) спрашиваем у пользователя номер дня недели. Храним день недели в переменной day. Так как номер дня - целое числовое значение, то используем функцию преобразования типов int() для input() обязательно.
  2. С помощью условий if проверяем:

Не забывайте - интерфейс программы должен быть максимально понятен и для ребёнка, и для бабушки. Вот наш код, наберите его и запустите. Следите за тем, чтобы сделать всё точно. Команды print() написаны с отступом в 4 пробела от if, к которому относятся:

day = int(input("Введите номер дня недели: ")) if (day == 7): print("Сегодня выходной. Едем кататься на велосипеде.") if (day < 1): print("Такого дня не существует.") if (day > 7): print("Такого дня не существует.")

Результат:

Введите номер дня недели: 7 Сегодня выходной. Едем кататься на велосипеде.

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


БЛОК ELSE


Блок else (читается как "иначе") относится к условию if. Выполняется в том случае, если основное высказывание, относящееся к if, ложно:

if (логическое высказывание): Блок команд №1 else: Блок команд №2

Когда логическое высказывание принимает значение True, тогда выполняется Блок команд №1

Когда логическое высказывание принимает значение False, тогда выполняется Блок команд №2

Расширим нашу предыдущую программу так, чтобы если введённый день был воскресенье, то программа выводила на экран фразу про выходной и велосипед. Если не воскресенье, то сообщала бы, что "Сегодня будний день".

Для этого добавим блок else к первому условию. Тогда если день будет равен 7, то программа выведет нашу фразу, если не равен 7, то сообщение о буднем дне.

day = int(input("Введите номер дня недели: ")) if (day == 7): print("Сегодня выходной. Едем кататься на велосипеде.") else: print("Сегодня будний день.") if (day < 1): print("Такого дня не существует.") if (day > 7): print("Такого дня не существует.")

Проанализируйте, что произойдёт, если мы введём несуществующий день? Например, -1?

Ответ

Результат работы программы при вводе -1:

Введите номер дня недели: -1 Сегодня будний день. Такого дня не существует.
Почему так? Откуда "лишняя" надпись?

Вдумайтесь, когда значение равно -1, то для условия if (day == 7): выполняется блок else, так как (-1 == 7) - это ложь.

Программа продолжает работать дальше, проверяя if (day < 1): и if (day > 7):, выводя соответствующую строку при возникновении истины в (day < 1).


Обдумав возникшую логическую путаницу, проанализируйте код и найдите три условных блока - ввода, обработки и вывода данных.


УСЛО­ВИЕ В УСЛО­ВИИ


Для решения проблемы с "лишней строкой" воспользуемся возможностью поместить новое условие в блок команд для существующего условия.

Условие внутри условия называется вложенным условием и выполняется только тогда, когда "внешнее" (родительское) условие выполняется, то есть результат логического выражения равен истине.

Выглядит это так:

if (логическое выражение): Команды главного условия (если требуется) if (логическое выражение): Команды вложенного условия else: (если требуется) Команды №2 вложенного условия else: (если требуется) Команды №2 главного условия

Подчёркиваю, что блочность структуры определяется отступом в четыре пробела. Таким образом можно создавать множество вложенных условий, например:

if (логическое выражение): if (логическое выражение): if (логическое выражение): if (логическое выражение): if (логическое выражение): Блок команд, наконец!

Главное здесь - не запутаться в логике и в отступах. Указанный в примере с множеством вложенных условий блок команд выполнится только в том случае, когда (выберите ответ):

  1. Каждое логическое выражение будет равно True.
  2. Каждое логическое выражение будет равно False.
  3. Не имеет значения, чему равны предыдущие логические выражения. Главное, чтобы расположенное перед выполняемым блоком команд (последнее) выражение равнялось True.

Ответ

1. Каждое должно быть истиной, так как следующий if начинает проверяться только тогда, когда предшествующее ему выражение истинно.


Чтобы программа не выводила лишних строк, мы её модифицируем:

day = int(input("Введите номер дня недели: ")) if (day == 7): print("Сегодня выходной. Едем кататься на велосипеде.") else: if (day < 1): print("Такого дня не существует.") else: if (day > 7): print("Такого дня не существует.") else: print("Сегодня будний день.")

Результаты работы (введены разные значения для каждого случая):

Введите номер дня недели: 5 Сегодня будний день. >>> Введите номер дня недели: -1 Такого дня не существует. >>> Введите номер дня недели: 8 Такого дня не существует. >>> Введите номер дня недели: 7 Сегодня выходной. Едем кататься на велосипеде.

Безусловно, код стал гораздо сложней. Требуются чуть больше усилий, чтобы в нём разобраться. Как только почувствуете, что ухватили логику и хитросплетение условий, попробуйте решить задачу:

Задача: мы вводим скорость автомобиля. Определить, нарушает ли водитель ограничение скорости в 60 км/ч.? Не забывайте: нельзя вводить отрицательное значение или скорость выше, к примеру, 200. Если введён 0, то автомобиль стоит на месте. Всю эту информацию программа должна вывести.

Решение открывайте только когда напишите собственную версию:

Программа: нарушает ли водитель?

speed = int(input("Введите скорость автомобиля: ")) if (speed > 200): print("Это не самолёт. Такой скорости не существует.") else: if (speed > 60): print("Водитель нарушает! Штраф ему, штраф!") else: if (speed == 0): print("Автомобиль стоит на месте.") else: if (speed < 0): print("Отрицательной скорости не существует.") else: print("Водитель не нарушает.")




БЛОК ELIF


Вложенные, громоздкие условия можно упорядочить и привести к более понятному виду с помощью конструкции elif, которая переводится как "ИНАЧЕ-ЕСЛИ".

Конструкция относится к блоку if и записывается до использования else (если else используется).

Блоки else и elif не являются обязательными. Условие может существовать и успешно работать без них. Только не запутайтесь в отступах!

Синтаксис следующий:

if (логическое выражение №1): Блок команд №1 elif (логическое выражение №2): Блок команд №2 elif (логическое выражение №...): Блок команд №... elif (логическое выражение №n): Блок команд № n else: Блок команд ELSE

При использовании elif все логические выражения должны быть разными, иначе теряется сам смысл elif.

Конструкция elif это тот же else-if, но записанный более понятно. Например, выражение:

if (логическое выражение №1): Блок команд №1 else: if (логическое выражение №2): Блок команд №2 else: Блок команд №3

... равнозначно этому:

if (логическое выражение №1): Блок команд №1 elif (логическое выражение №2): Блок команд №2 else: Блок команд №3

Написано более аккуратно и понятно для программиста. Это важно. Вскоре вы столкнётесь с необходимостью анализировать довольно большие блоки кода. И чем проще в них выражена идея алгоритма, чем проще записан алгоритм на языке программирования, тем проще для вас - находить ошибки, исправлять, дополнять или сокращать программу. Пожалейте себя - пишите просто, доступно и понятно!

Если логическое выражение №1 ложно, начинает проверяться логическое выражение №2. Если и оно ложно, то выполнится блок команд №3 после else.

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

Не мешкая перепишем код про выходные и велосипед. Заметьте, что он стал короче и удобней для восприятия:

day = int(input("Введите номер дня недели: ")) if (day == 7): print("Сегодня выходной. Едем кататься на велосипеде.") elif (day < 1): print("Такого дня не существует.") elif (day > 7): print("Такого дня не существует.") else: print("Сегодня будний день.")

Вот и реализация одного из принципов языка Python, демонстрация магии "летающего цирка Монти Пайтона": упростить излишне сложное.


НАРУ­ШАЕТ ЛИ ВОДИ­ТЕЛЬ?


Перепишите программу с использованием elif. Готовый текст можно посмотреть только после того, как сделаете сами. Или как только зайдёте в тупик, что вряд ли.

Программа: нарушает ли водитель?

speed = int(input("Введите скорость автомобиля: ")) if (speed > 200): print("Это не самолёт. Такой скорости не существует.") elif (speed > 60): print("Водитель нарушает! Штраф ему, штраф!") elif (speed == 0): print("Автомобиль стоит на месте.") elif (speed < 0): print("Отрицательной скорости не существует.") else: print("Водитель не нарушает.")


Далее нас ждут сложные условия. Сложные - не потому что они сложнее, чем представленный здесь материал, а потому что состоят из нескольких высказываний и объединены специальными логическими операциями not, and или or. Будет интересно!


© 2019-2021 Виктор Трофимов
[ Оглавление ] [ В начало страницы ]