Найти в Дзене

Условная конструкция. Операторы if, elif, else.

На сегодняшнем занятии мы с вами поговорим про условный оператор.

До этого все программы, которые мы делали, выполнялись последовательно, например, если есть 3 команды print(), то при запуске будем видеть последовательный результат выполнения всех этих 3 команд: сначала 1, потом 2, потом 3(рис.1). У нас нет никакого выбора, мы просто говорим компьютеру, что нам нужно выполнить.

Рис.1

Однако бывают ситуации, когда нам необходимо выполнять определённые строчки кода при определенных обстоятельствах. Например, мы запрашиваем ввод имени пользователя и с ним здороваемся. При запуске мы вводим любое имя и видим некое приветствие(рис.2).

-2

Рис.2

Однако представим, что мы хотим поприветствовать какого-то человека по-особенному, например, добавим строчку print(‘Здравствуйте, администратор’). Сейчас у нас при запуске программы эта строчка будет выходить при любом раскладе, то есть у нас 2 раза идёт приветствие(рис.3).

-3

Рис.3

Но мы хотим сделать так, чтобы строчка print(‘Здравствуйте, администратор’) кода выполнялась только с особенным именем, а во всех остальных случаях выполнялась строчка кода с обычным приветствием print(“Привет”, name). Как это можно сделать?

Тут нам необходимо добавить условие, то есть некое ветвление в программе, которое она будет выполнять в зависимости от того, какое имя будет введено. Чтобы создать условие, мы используем оператор if, после которого идёт само условие. И тут нам нужно написать: если наша переменная name и, к примеру, 2 знака равно (if name ==). Почему 2 знака равно? Потому что один знак равно - это присвоение, мы используем для создания переменных и изменений их значений, а два знака равно - проверка на равенство. Здесь if name(наше имя) == ‘Urban’:(рис.4). Двоеточие - мы как бы говорим, что все мы закончили формировать наше условие.

-4

Рис.4

Код, который идёт после двоеточия, обязательно должен идти с отступом в 4 пробела или с табуляцией. Благодаря вот этим отступам программа понимает, что какие-то команды относятся к определённому блоку кода. Здесь строчка print(‘Здравствуйте, администратор’) относится к нашему условию, в котором говорится: если переменная name имеет значение такое же, как и строка Urban, то мы будем выводить эту строчку.

Запускаем. Вводим имя пользователя, например, Денис. Видим только строчку, “Привет, Денис”(рис.5), то есть код, который пишется без отступа, он уже не относится к условию. Однако если мы сейчас напишем здесь “Urban”, то мы увидим 2 приветствия: “Здравствуйте, администратор” и “Привет Urban”(рис.6).

-5

Рис.5

-6

Рис.6

Однако в нашей программе, допустим, всего 2 исхода. То есть мы хотим, либо, если имя Urban, выводить приветствие print(‘Здравствуйте, администратор’), а во всех остальных случаях мы хотим видеть строчку print(“Привет”, name).

Дабы избежать вот таких двойных выводов, мы можем добавить еще одну команду - else, что переводится как иначе. После этой команды сразу идет двоеточие, то есть никаких условий дополнительно прописывать не надо.

Данная команда сработает в том случае, если не сработает команда if. Получается теперь, если мы вводим имя, например Денис, мы видим строку “Привет, Денис”, потому что условие if name(наше имя) == ‘Urban’: не выполнилось(рис.7). В нашей переменной name значение не равняется Urban и условие не сработало, сработало только else.

-7

Рис.7

Однако если при запуске ввести имя Urban, то мы получим строчку “Здравствуйте администратор”(рис.8), то есть выполнится строчка print(‘Здравствуйте, администратор’).

-8

Рис.8

Таких вот if на самом деле в программе может быть много. То есть блок условий у нас всегда начинается с команды if, и мы можем оставить либо один if, либо добавить туда ещё, например, команду else. Также здесь можно, например, создать еще одно условие: если наша переменная name равняется Денис, то мы будем выводить строку “Здравствуйте, преподаватель”.

Запустим. Введем имя, например Денис. Видим “Здравствуйте, преподаватель”(рис.9). Этих условий может быть очень, очень много. Однако в данном случае, на самом деле этот блок условий составлен не совсем верно.

-9

Рис.9

Давайте для примера рассмотрим типовую задачу, которая называется FizzBuzz. В чем суть задачи? Пользователь у нас должен вводить число, давайте создадим переменную number, куда пользователи будет водить число(рис.10).

-10

Рис.10

По условию данной задачи: если число делится на 3, мы должны выводить Fizz; если введенное число делится на 5, мы должны выводить Buzz; если число делится и на 3, и на 5, то мы должны выводить FizzBuzz. Как нам это сделать?

Вероятно, нам нужно применить условие. Давайте попробуем. Число делится на другое число, если остаток от деления равен 0. Поэтому мы возьмём наше число number, знак % - остаток от деления и 3. То есть мы говорим: если разделить на 3 и проверить остаток и он будет равен нулю, то будем выводить Fizz(рис.11). Здесь при формировании условий ничего сложного нет. Если остаток от деления на 3 равняется 0, тогда мы выводим Fizz. Если остаток от деления на 5 равен 0, то мы выводим Buzz(рис.12). Однако есть еще и FizzBuzz, где нам нужно проверить 2 условия в одном. Как это можно сделать?

-11

Рис.11

-12

Рис.12

Для проверки нескольких условий внутри одного нам понадобятся новые команды это or и and. Or - это не строгий оператор, and - это строгий оператор. Что это значит?

Вот представим, что у нас есть условие, где наше число должно делиться на 3. Если наше число делится на 3 и нам нужно проверить, что число тоже делится на 5. В данном случае нам нужно использовать and, потому что нам нужно, чтобы оба условия выполнялись, то есть условия слева и справа дало нам верный результат. Если бы нам нужно было, чтобы хотя бы одно из этих условий, то есть если число делится либо на 3, либо на 5, мы бы здесь могли применить or. Однако в нашем случае мы должны применить and, то есть если число делится на 3 и число делится на 5, то в таком случае мы будем выводить FizzBuzz(рис.13).

-13

Рис.13

Казалось бы, программа написана, верно: у нас есть 3 условия и теперь все должно пойти как по маслу. Давайте проверять. Запускаем, вводим 3, получаем Fizz(рис.14), правильно. Вводим 5, получаем Buzz(рис.15), правильно. Теперь нам нужно ввести число, которое делится и на 3, и на 5. Введем 15. Ожидали увидеть FizzBuzz, а получили и Fizz, и Buzz и FizzBuzz(рис.16). Почему так?

-14

Рис.14

-15

Рис.15

-16

Рис.16

Когда мы используем команду if, мы создаем блок условий. То есть у нас здесь первый блок условий, 2 блок условий, 3 блока условий. С командой if наш блок условий начинается. Однако здесь нужно сделать так, чтобы при выполнении одного условия компьютер дальше не проверял другие условия. Чтобы сделать так, нужно дополнить этот блок условий командами elif(рис.17), то есть:

if number % 3 == 0:

elif number % 5 ==0:

elif number %3 == 0 and number % 5 == 0:

-17

Рис.17

Так у нас все эти условия будут относиться к одному единственному блоку условий. Если компьютер выполнит первое, то остальные условия его интересовать не будут, он просто их не будет проверять. Если первое не выполнилась, он перейдет к следующему условию, а остальные условия не будет проверять.

Казалось бы, это решение. Однако нет, не все так гладко. Если мы введем 15, мы получим Fizz, потому что у нас выполнилось первое условие и остальные просто дальше не проверяются. Поэтому существует некое негласное правило формирования условий: когда мы имеем несколько каких-то условий, самое маловероятное, самое тяжёлое, обычно мы стараемся поместить в самый верх. То есть нам нужно условия поменять местами. Однако видим здесь ошибку(рис.18), потому что блок условий не может начинаться с команды elif, блок условий всегда начинается с if, а в блоке с if делаем elif.

-18

Рис.18

Теперь, когда мы вводим 3, то получаем Fizz(рис.19); вводим 5, получаем Buzz(рис.20); вводим 15 получаем FizzBuzz(рис.21). То есть в данном случае у нас программа работает верно.

-19

Рис.19

-20

Рис.20

-21

Рис.21

Однако ее можно немножко дополнить, если мы введем, например, 2 или 4. 4 у нас не делятся ни на 3, ни на 5. Мы не получаем никакого результата. В таком случае мы будем говорить: иначе(else), если у нас ни одно из этих условий не выполняется, то пишем “Число не подходит”(рис.22).
В таком случае, если мы вводим какое-то число, которое делится на 3, либо на 5, то получаем результат в соответствии с нашим заданием.
Если введём число, которое у нас не попадает под наши условия, то будем получать сообщения о том, что данное число не подходит.

-22

Рис.22

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

Если and мы заменим на or, то мы будем получать сообщение FizzBuzz(рис.23), когда у нас выполняется одно из этих двух условий. Если введем 3, то получим FizzBuzz, потому что условие выполнилось.

-23

Рис.23

Or - это не строгий оператор, то есть либо слева, либо справа, если хотя бы одно из них выполняется, то условие можно считать верным, но в нашем случае здесь необходим and.