Python: Декларативное программирование
Теория: Генераторы множеств и словарей
Представим себе программиста на Python. Имея на руках список пар значений, он всегда может получить множество уникальных пар, применив к списку функцию set().
Уже из этого множества легко получить словарь, применив функцию dict(). Кажется, что с помощью генераторов списков мы можем описывать словари и множества так же декларативно, как и списки.
Однако в большинстве случаев это неоптимальное решение: в памяти будет создан и сохранен целиком весь промежуточный список. Особенно неприятно будет тратить лишнюю память, если при генерации элементов множества или словаря возникнет много повторяющихся значений или ключей.
Python и здесь приходит нам на помощь. Он предоставляет генераторы множеств и генераторы словарей, которые мы изучим в этом уроке.
Генераторы множеств
С этими генераторами все максимально просто. Нужно всего два действия:
- Взять выражение, описывающее генератор списка
- Заменить в нем квадратные скобки на фигурные
Посмотрим, как это работает:
Вы получаете все те же возможности, которые доступны для генерации списков. Есть и дополнительное преимущество — при создании множества можно еще и проследить за тем, чтобы в список не попали дубли. Так можно сэкономить память.
Генераторы словарей
Генераторы словарей выглядят очень похоже на генераторы множеств. Разница заключается в том, как описывается элемент словаря.
Нужно сгенерировать не только значение, но и ключ. При этом ключ надо указать через двоеточие — так же, как при написании литерала словаря.
Посмотрим на примере:
Обратите внимание, что в этом примере ключ 'l'имеет значение 10. Посмотрим, какие значения имели char и pos во время генерации. Для простоты будем смотреть только на позиции символа 'l':
Как можно заметить, 'l' встречается в исходной строке три раза — в последнем случае как раз в позиции 10. При генерации словаря используется последнее значение для каждого из ключей, будто словарь был заполнен в подобном цикле:
В примере выше порядок ключей получается тот же самый — это порядок первого появления соответствующего символа в строке. Последующие перезаписи значений этот порядок не изменят. Словари в Python запоминают порядок добавления ключей, но не порядок последующих изменений значений.
В генераторах множеств в результирующее множество попадают первые уникальные значения. В большинстве случаев это не критично, но помнить об этом стоит.