Причина
Вероятно, вы уже работали со словарями в 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 будут повторяться, стоит задуматься. Возможно, именно там лучше будет смотреться словарь. Эта техника, конечно, не всегда будет полезна, но ведь приятно иметь дополнительную примочку в вашем наборе инструментов.