Ветвления и множественные ветвления
Оператор if может включать блок кода, который выполнится в том случае, если условие ложно. Для этого существует конструкция if / else.
Если условное выражение истинно, выполняется код из блока if, а если условие ложно — сработает код из блока else.
if <условие>:
<код, который выполнится, если условие истинно>
# Внимание: этот блок имеет отступ в 4 пробела от начала строки
else:
<код, который выполнится, если условие ложно>
# Этот блок тоже отбит от начала строки 4 пробеламиif beaufort == 0:
print('Штиль')
else:
print('Есть ветер')Пример множественного ветвления:
if beaufort == 0:
print('Штиль')
else:
if beaufort == 1:
print('Тихий ветер')
else:
if beaufort == 2:
print('Лёгкий ветер')
else:
if beaufort == 3:
print('Слабый ветер')
else:
if beaufort == 4:
print('Умеренный ветер')
else:
if beaufort == 5:
print('Свежий ветер')
else:
if beaufort == 6:
print('Сильный ветер')
else:
print('Шторм')Достаточно длинный и сложно читаемый код, который можно упростить:
if beaufort == 0:
print('Штиль')
elif beaufort == 1:
print('Тихий ветер')
elif beaufort == 2:
print('Лёгкий ветер')
... else: # Если не сработало ни одно условие в предыдущем коде -
# выполняется код в блоке else
print('Шторм')
Код выше можно сделать проще используя словарь и об этом будет ниже
Также небольшие выражение могут быть заключены в одну строку:
i=1 j=5 min=i if i<j else j print(min)
Еще немного примеров для упрощения ветвлений If…else:
Ветвление через функцию:
def check_access(user_role):
if user_role == 'admin':
return 'можно'
return 'нельзя'
print(check_access('admin'))Сокращаем до одной строки:
def check_access2(user_role):
return 'можно' if user_role=='admin' else 'нельзя'
print(check_access2('admin'))Бывает, что надо выбрать несколько соответствий как в коде ниже:
def check_access3(user_role):
if user_role == 'admin' or user_role=='moderator' or user_role=='root':
return 'allowed'
return 'prohibited'print(check_access3('user'))Однако, подобные ситуации лучше решать через использование кортежа или словаря. Ниже пример с кортежем:
def check_access4(user_role):
allowed=('admin', 'moderator', 'root')
if user_role in allowed:
return 'allowed'
return 'get lost'print(check_access4('user'))В какой ситуации можно было бы использовать словарь? Посмотрим на следующий код:
def check_access5(user_role):
if user_role == 'admin':
return 'можно все'
if user_role == 'moderator':
return 'можно модерировать'
if user_role == 'author':
return 'можно писать'
return 'можно читать'
print(check_access5('admin'))
Либо более правильный вариант с применением elif:
def check_access5(user_role):
if user_role == 'admin':
return 'можно все'
elif user_role == 'moderator':
return 'можно модерировать'
elif user_role == 'author':
return 'можно писать'
return 'можно читать'
print(check_access5('admin'))
Упрощаем этот код через словарь:
def check_access6(user_role):
role_access = {
'admin': 'Можно все',
'moderator': 'Можно модерировать',
'author': 'можно писать'
}
return role_access.get(user_role, 'Можно читать')
print(check_access6('admin'))И теперь можно через словарь упростить код со шкалой Бофорта, который разбирали ранее, но прежде разберем метод get для работы со словарем.
get() в Python принимает максимум два параметра: key ‒ ключ для поиска в словаре; value (необязательно) ‒ значение, которое будет возвращено, если ключ не найден.
person = {
'name': 'Phill',
'age': 22
}
print('Name: ', person.get('name'))
print('Age: ', person.get('age'))Name: Phill Age: 22
Теперь вернемся к коду со школой Бофорта. Упрощенный код будет выглядеть вот так:
def pogoda(points):
data = {
1: 'Тихий ветер',
2: 'Легкий ветер',
3: 'Слабый ветер',
4: 'Умеренный ветер',
5: 'Свежий ветер',
6: 'Сильный ветер'
}
return data.get(points, 'Шторм')
print(pogoda(3))