Сегодня вы узнаете про быстрый, элементарный, но оттого не менее полезный совет, крайне редко упоминающийся в статьях о словарях 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
Читайте также:
- Генерация API-документации из docstrings на Python
- Управление памятью в Python: 3 частых вопроса на собеседовании
- Как работать с большими наборами данных в Python: 3 способа
Читайте нас в Telegram, VK и Яндекс.Дзен