Используем Словари как Альтернативу Конструкции if-else

Причина

Вероятно, вы уже работали со словарями в Python. Возможно даже делаете это часто. Но освоили ли вы их целиком? Знаете ли, в каких случаях их действительно удобнее использовать? А может, использовали там, где не было явно видно, что это необходимо.

В этой статье мы сфокусируемся на использовании словарей в качестве альтернативы if-else выражениям.

Собираем конструкцию if-else с бонусом в виде значений по умолчанию

Представим, что у нас есть список с ценами продуктового магазина:

price_list = {'fish': 8,
              'beef': 7,
              'broccoli': 3,}

Мы хотим вывести цену товара, но понимаем, что не каждый товар находится в прайс-листе. Поэтому мы решили создать функцию:

def find_price(item):
    if item in price_list:
        return 'The price for {} is {}'.format(item, price_list[item])
    else:
        return 'The price for {} is not available'.format(item)
>>>find_price('fish')
'The price for fish is 8'
>>>find_price('cauliflower')
'The price for cauliflower is not available'

Шикарно. Оператор if-else делает именно то, что мы хотим: возвращает значение по умолчанию, когда элемент недоступен. Но мы дважды обращаемся к словарю и используем два оператора, чтобы вернуть почти одно и то же. Можем ли мы сделать лучше? Есть ли способ, который вернет значение по умолчанию в том случае, если элемент отсутствует в списке? К счастью, есть возможность сделать это с помощью метода словарей Python get()

def find_price(item):
    return 'The price for {} is {}'.format(item, price_list.get(
        item, 'not available'))

Метод get() ищет ключ и возвращает значение по умолчанию если такого ключа не находит. Код определенно выглядит короче, но работает ли он так, как мы хотим?

>>>find_price('fish')
'The price for fish is 8'
>>>find_price('cauliflower')
'The price for cauliflower is not available'

Миленько!

Но могу ли я использовать словарь в функции, для замены if/else конструкции, которая не использует словари?

Хороший вопрос. Давайте рассмотрим пример, который абсолютно не использует словарь.

Представьте, что вы хотите создать функцию, которая возвращает значение для операции между 2 числами. Итак, вот что вы придумали:

def operations(operator, x, y):
    if operator == 'add':
        return x + y
    elif operator == 'sub':
        return x - y
    elif operator == 'mul':
        return x * y
    elif operator == 'div':
        return x / y
>>>operations('mul', 2, 8)
16

Здесь использование словаря будет еще более впечатляющим:

def operations(operator, x, y):
    return {
        'add': lambda: x+y,
        'sub': lambda: x-y,
        'mul': lambda: x*y,
        'div': lambda: x/y,
    }.get(operator, lambda: 'Not a valid operation')()

Имена операторов становятся ключами, а lambda эффективно пихает функции в значения словарей. get() возвращает значение по умолчанию, когда ключ не найден.

>>>operations('mul', 2, 8)
16
>>>operations('unknown', 2, 8)
'Not a valid operation'

Заключение

Поздравляем! Теперь вы узнали, как использовать словари в качестве альтернативы выражениям if-else. Итак, когда вы будете применять эти трюки? Если вы заметите, что операторы if-else будут повторяться, стоит задуматься. Возможно, именно там лучше будет смотреться словарь. Эта техника, конечно, не всегда будет полезна, но ведь приятно иметь дополнительную примочку в вашем наборе инструментов.