Оптимизация условного ветвления

Рейтинг: 1Ответов: 3Опубликовано: 07.08.2023

Есть код:

def Vybor(x):
    if x == 1:
        print("нечто")
        a()
    elif x == 2:
        print("что-то")
        b()
    elif x == 3:
        print("неизвестно что")
        с()

Возможно ли этот "код" (это просто пример типичного кода с ветвлением) сделать более "питонским", оптимизировать его (например, с использованием словарей и т. п.)?

Ответы

▲ 2Принят
def vybor(x):
    options = {
        1: "нечто",
        2: "что-то", 
        3: "неизвестно что",
    }
    
    if x in options:
        print(options[x])
    else:
        print("Неправильный параметр.")

Примечание:

Я изменил имя функции Vybor на vybor, чтобы оно состояло только из строчных букв, в соответствии с PEP 8 - руководством по написанию кода на Python:

Имена функций

Имена функций должны состоять из маленьких букв, а слова разделяться символами подчеркивания — это необходимо, чтобы увеличить читабельность.

▲ 4

С версии python 3.10 возможно использовать match case конструкцию.

def select(x):
    match x:
        case 1:
            print("нечто")
        case 2:
            print('что-то')
        case 3:
            print('неизвестно что')
        case _:
            print('А такого мы не ожидали')

select(2)

вывод:

что-то

case _ используется, для любых других значений, не подходящих под паттерн.

▲ 2

Дополню ответ @MarianD, и добавлю, как можно сделать ещё и вызов нужной функции:

def vybor(x):
    options = {
        1: ("нечто", a),  # значения теперь не строки, а кортежи вида (строка, функция)
        2: ("что-то", b),   # обратите внимание - скобки после имени функции ставить не нужно
        3: ("неизвестно что", c),
    }
    
    option = options[x]
    print(option[0])  # печатаем нужную строку
    option[1]()  # вызываем нужную функцию