July 25, 2022

Ветвления и множественные ветвления

Вернуться к содержанию

Оператор 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))

Вернуться к содержанию