Ветвления и множественные ветвления
Оператор 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))