Улучшение Python кода: замените if-elif условие на словарь!

Сегодня вы узнаете про быстрый, элементарный, но оттого не менее полезный совет, крайне редко упоминающийся в статьях о словарях Python. 

Если вы уже знакомы с типом данных dict (сокращение от слова “dictionary”, что в переводе означает “словарь”) в языке программирования Python, то вы можете пропустить второй раздел статьи, хотя очередное повторение технической грамоты никогда не будет лишним.


1. Словари Python

Тип данных “словарь”  —  это неупорядоченный набор ключей и значений. В Python словари создаются с помощью фигурных скобок. Следующий код послужит нам типичным примером такого словаря:

    me_dict = {
    "имя": "Мария",
    "medium": "imgvoid"
}

Исходя из примера, можно отметить такие понятия, как идентификатор или ключ (например, “имя”) и определение или значение (например, “Мария”). Контейнер с парой ключ-значение работает по принципу базы данных: при запросе к идентификатору-ключу контейнер-словарь возвращает соответствующее вызываемому ключу значение.

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

В приведенном выше примере, чтобы получить значение для ключа имя, нужно написать следующий код:

me_dict.get("имя")
# "Мария"

А вот для получения значения ключа medium_handle следует написать следующее:

me_dict.get("medium")
# "imgvoid"

Обратите внимание, что вы также можете получить доступ к данным внутри словаря, используя символы открывающей и закрывающей квадратных скобок []:

me_dict["medium"]
# "imgvoid"

Однако лучше использовать метод get(), поскольку он может обрабатывать исключения KeyError, возникающие при отсутствии нужного ключа в словаре:

>>> me_dict["несуществующий_ключ"]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 'несуществующий_ключ'
# Выполнение кода останавливается
>>> me_dict.get("несуществующий_ключ")
# Нет сообщения об ошибке, потому что исключение обработано

2. Словарь вместо длинного условия

Вы когда-нибудь сталкивались с тем, что ваш код содержит слишком много разных условий elif?

Все сталкивались, это уж точно. 

Предположим, что вас заботит одна проблема, которую срочно нужно решить: как получить данные от пользователя и выполнить некоторый код только в том случае, когда пользовательский ввод соответствуют определенному значению? Конечно же, принимая во внимание тот факт, что пользователь может ввести в программу всё, что ему вздумается.

Давайте рассмотрим пример, который быстрее всего приходит в голову большинству новичков (за исключением того, что вместо четырех условий elif у вас в коде будет гораздо больше утверждений):

user_input = input("")

if user_input == "зелёный":
    # Выполнить некоторый код, например, вывести на экран цвет + число "1"
    print(f"{color} 1")
elif user_input == "синий":
    # Выполнить некоторый код, например, вывести на экран цвет + число "2"
    print(f"{color} 2")
elif user_input == "красный":
    # Выполнить некоторый код, например, вывести на экран цвет + число "3"
    print(f"{color} 3")
elif user_input == "розовый":
    # Выполнить некоторый код, например, вывести на экран цвет + число "4"
    print(f"{color} 4")

Это довольно плохая идея: такой код не только крайне требователен к оперативной памяти компьютера (хотя операторы elif, по идее, используются как раз для “предотвращения” подобного), но и весьма плох с точки зрения читаемости.

Что же делать? Использовать словари Python, конечно же! Словарь вполне справляется с тем, чтобы хранить в виде значений обычные объекты, а значит, ничего не помешает сохранить в качестве значения даже объект функции:

def green_function(color):
    # Выполнить некоторый код, например, вывести на экран цвет + число "1"
    print(f"{color} 1")


def blue_function(color):
    # Выполнить некоторый код, например, вывести на экран цвет + число "2"
    print(f"{color} 2")


def red_function(color):
    # Выполнить некоторый код, например, вывести на экран цвет + число "3"
    print(f"{color} 3")


def pink_function(color):
    # Выполнить некоторый код, например, вывести на экран цвет + число "4"
    print(f"{color} 4")
    
    
colors_dict = {
    "зелёный": green_function,
    "синий": blue_function,
    "красный": red_function,
    "розовый": pink_function,
}

user_input = input("")
colors_dict.get(user_input)(user_input)

Конечно, код для такого решения кажется длиннее, но при работе с большим количеством различных вариантов ветвления алгоритма он быстрее пишется, лучше выглядит и экономит оперативную память вашего компьютера.

Как вы видите, ключи словаря colors_dict ссылаются на разные объекты функций, по одному на каждый цвет. Помните, что ни в коем случае нельзя добавлять круглые скобки после названия функции — это приведет к её моментальному выполнению; вам же нужно сослаться именно на объект функции, а не на её результат.

Затем, используя пользовательский ввод, мы получаем объект одной из функций и вызываем её, передавая пользовательский ввод в качестве аргумента color.

Приведенный выше код довольно бесполезен, но он должен помочь вам понять суть.

Теперь выполните в интерактивной сессии интерпретатора Python следующую команду:

>? синий
# синий 2

Вывод

Вот и всё! Теперь вы знаете простой и быстрый приём программирования на Python — можете начать им пользоваться прямо сейчас, чтобы избавиться от слишком большого количества операторов if и else в коде ваших программ.

Оригинал статьи: Too Many If-Elif Conditions in Python? Use Dictionaries Instead by Tommaso De Ponti

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен

Предыдущая статьяОтказ после четырех раундов технических собеседований. Что делать?
Следующая статьяСоздание компонентной дизайн-системы UI