Skip to content

Краткий конспект по занятию №2

Evgeny Vlasov edited this page Oct 10, 2019 · 1 revision

Занятие 2.

Ветвление и введение в исключения

1. Для чего разветвлять программу

Ветвление - прекрасный инструмент, привносящий гибкость в ваш код. Основная идея ветвления состоит в следующем: если данные удовлетворяют определенным условиям (чаще всего выраженным в виде логических выражений), то делаем одно, в противном случае или иначе - делаем другое.

В итоге, имеем структуру :

если ВЕРНО 
    то делай одно
иначе
    делай другое

На прошлой лекции мы узнали несколько базовых типов, а значит, уже можем принимать данные, в чем-то их хранить (пускай, в самом примитивном виде).

Рассмотрим классический пример. Вы создаете страницу регистрации для своего сервиса. Возрастное ограничение - 12+. Поэтому пользователей, чей возраст больше заданного - мы пропускаем, а тех, чей возраст меньше - мы останавливаем и просим вернуться, когда пользователь станет старше.

Реализуем сказанное в виде кода:

name = input("Enter your name: ")
email = input("Enter email: ")
age = int(input("Enter your age: "))

если age > 12
    то print("Welcome!)
иначе
    print("No no no no")

После выполнения данного кода получим ошибку SyntaxError. Это значит, что Python не понял наших благих намерений.

2. Сигнатура ветвления

Объясним ему по-понятнее. Ветвления (они же условные операторы) в Python имеют специфическую сигнатуру:

if expression:
    ....
else:
    ....

Важно понимать 2 момента:

  • expression - логическое условие (обязано возвращать True или False, а так же их аналоги). Аналогом False в логических конструкциях явялется 0 и None. Аналогом True - все остальное.
  • После символа : идет тело логического оператора. Обратите внимание на остутпы, четко отделяющие области логического оператора и его внутреннего тела. Python - язык чувствительный к отступам, поэтому стоит обращать внимание на то, как они устроены в вашей программе (подробнее про отступы мы будем разговаривать на следующей лекции).

Применим полученные знания для решения задачи выше:

name = input("Enter your name: ")
email = input("Enter email: ")
age = int(input("Enter your age: "))

if age > 12:
    print("Welcome!)
else:
    print("No no no no")

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

3. Множественное ветвление

Сигнатура оператора множественного ветвления выглядит следующим образом:

if expression1:
    ...
elif expression2:
    ...
elif expression3:
    ...
...
    ...
elif expressionN:
    ...
else:
    ...

Где elif сокращение от конструкции else if и читается как иначе если.

Рассмотрим пример:

Если пользователю больше 21 года - перенаправляем его на личный кабинет. Если пользователю больше 18, но меньше 21 года - просим его зарегестрироваться повторно, а если пользователю меньше 18 лет - сервис для него недоступен.

name = input("Enter your name: ")
email = input("Enter email: ")
age = int(input("Enter your age: "))

if age > 21:
    showPersonal() # Какая-то функция
elif age > 18 and age <= 21:
    showAgain() # Еще какая-то функция
else:
    print("No no no no")

Обратите внимание, что и if и elif обязаны иметь при себе логическое выражение. В случае, если это выражение True - выполняется первый попавшийся блок, соответствующий этому выражению. В случае, если все выражения равны False - выполняется блок else.

4. О логических выражениях

Рассмотрим примеры работы с логическими выражениями. Пусть имеется переменная temp = 23. Просто потому что.

Тогда возможные логические выражения с этой переменной:

  • Больше : temp > 21 Результат: True
  • Меньше : temp < 21 Результат: False
  • Больше или равно : temp >= 22 Результат: True
  • Меньше или равно : temp <= 23 Результат: True
  • Проверка на равенство : temp == 23 Результат : True
  • Проверка на неравенство : temp != 5 Результат : True

В примере п.3 age > 21 становится True, если введенный пользователем возраст начинается от 22 лет и выше.

Допустим, теперь переменная temp = False. Тогда логические выражения:

  • Логическое И : temp and True Результат: False (если один из них ложный - результат ложный)
  • Логическое ИЛИ : temp or True Результат: True (если один из них истина - результат истина)

5. Введение в исключения

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

Пример такой ситуации: деление на ноль. Это просто киллер всех языков программирования. Но BPS тебя не бросит. Сейчас научимся делить на ноль.

Допустим стоит следующая задача:

На вход программе подается 2 целых числа. В ответе необходимо вывести результат деления этих чисел друг на друга.

numerator = int(input())
denominator = int(input())

print(numerator/denominator)

Результат работы:

1
0
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ZeroDivisionError: division by zero

Внезапно. Сломали код с первой попытки. Это успех. Обрати внимание, что ошибка здесь спровоцированна не потому, что код написан неверно, а лишь по тому, что возникает недопустимая ситуация деления на ноль в run-time (во времени исполнения программы, в процессе работы программы).

Для того, чтобы наш код мог обработать и такую ситуацию и стать непобедимым нужно воспользоваться отлавливателем исключений (обрабатывать исключения будем немного позднее):

Сигнатура отлавливателя :

try:
    ....
except:
    ....

Теперь обернем наш код в обертку отлавливателя:

numerator = int(input())
denominator = int(input())
try:
    print(numerator/denominator)
except:
    print("Zero Division. Lol")

Теперь результатом выполнения будет:

1
0
Zero Division. Lol

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

Совет: всегда помещайте потенциально опасный код внутри блока try. Он нужен для того, чтобы, буквально, попытаться выполнить свое тело. В случае, если при попытке выполнения тела блока try возникает ошибка, отлавливатель передает эстафету выполнени блоку except.

6. Некоторые тонкости от BPS

Тонкость №1. Однозначность и однострочность. Если тело условного оператора небольшое, например :

if a > 2:
    print("Kek")

То такой оператор можно записывать в одну строчку без вреда для оставшегося кода:

if a > 2: print("Kek")

Это экономит время и место.

Токность №2. Исключение в исключении. Что если возникают исключительные ситуации уже в блоке except? Не беда. Воспользуйся братом отлавливателя исключений - исключителем.

try:
    ...
except:
    ...
continue:
    ...
finally:
    ...

Не оставим исключениям ни шанса.

Токность №3. Стремление к прекрасному. Хороший программист пишет хороший код. А хороший код учитывает все возможные ситуации поведения программы (это идеал). Соответственно, если в коде есть отлавливатель исключений - после пристального разбора и прокачки кода, блок try/except нужно заменять блоками if/else.