-
Notifications
You must be signed in to change notification settings - Fork 3
Краткий конспект по занятию №2
Ветвление - прекрасный инструмент, привносящий гибкость в ваш код. Основная идея ветвления состоит в следующем: если данные удовлетворяют определенным условиям (чаще всего выраженным в виде логических выражений), то делаем одно, в противном случае или иначе - делаем другое.
В итоге, имеем структуру :
если ВЕРНО
то делай одно
иначе
делай другое
На прошлой лекции мы узнали несколько базовых типов, а значит, уже можем принимать данные, в чем-то их хранить (пускай, в самом примитивном виде).
Рассмотрим классический пример. Вы создаете страницу регистрации для своего сервиса. Возрастное ограничение - 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 не понял наших благих намерений.
Объясним ему по-понятнее. Ветвления (они же условные операторы) в 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")
После чего можно убедиться, что все работает как и планировалось.
Сигнатура оператора множественного ветвления выглядит следующим образом:
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
.
Рассмотрим примеры работы с логическими выражениями.
Пусть имеется переменная 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
(если один из них истина - результат истина)
Исключительная ситуация (исключение) - ситуация, в результате которой выполнение программы прерывается из-за неприемлимого типа входных данных или неправильной обработки входных данных.
Пример такой ситуации: деление на ноль. Это просто киллер всех языков программирования. Но 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
.
Тонкость №1. Однозначность и однострочность. Если тело условного оператора небольшое, например :
if a > 2:
print("Kek")
То такой оператор можно записывать в одну строчку без вреда для оставшегося кода:
if a > 2: print("Kek")
Это экономит время и место.
Токность №2. Исключение в исключении.
Что если возникают исключительные ситуации уже в блоке except
? Не беда. Воспользуйся братом отлавливателя исключений - исключителем.
try:
...
except:
...
continue:
...
finally:
...
Не оставим исключениям ни шанса.
Токность №3. Стремление к прекрасному.
Хороший программист пишет хороший код. А хороший код учитывает все возможные ситуации поведения программы (это идеал). Соответственно, если в коде есть отлавливатель исключений - после пристального разбора и прокачки кода, блок try/except
нужно заменять блоками if/else
.