HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Представим себе программиста на Python. Имея на руках список пар значений, он всегда может получить множество уникальных пар, применив к списку функцию set().</p>
1 <p>Представим себе программиста на Python. Имея на руках список пар значений, он всегда может получить множество уникальных пар, применив к списку функцию set().</p>
2 <p>Уже из этого множества легко получить словарь, применив функцию dict(). Кажется, что с помощью генераторов списков мы можем описывать словари и множества так же декларативно, как и списки.</p>
2 <p>Уже из этого множества легко получить словарь, применив функцию dict(). Кажется, что с помощью генераторов списков мы можем описывать словари и множества так же декларативно, как и списки.</p>
3 <p>Однако в большинстве случаев это неоптимальное решение: в памяти будет создан и сохранен целиком весь промежуточный список. Особенно неприятно будет тратить лишнюю память, если при генерации элементов множества или словаря возникнет много повторяющихся значений или ключей.</p>
3 <p>Однако в большинстве случаев это неоптимальное решение: в памяти будет создан и сохранен целиком весь промежуточный список. Особенно неприятно будет тратить лишнюю память, если при генерации элементов множества или словаря возникнет много повторяющихся значений или ключей.</p>
4 <p>Python и здесь приходит нам на помощь. Он предоставляет<strong>генераторы множеств</strong>и<strong>генераторы словарей</strong>, которые мы изучим в этом уроке.</p>
4 <p>Python и здесь приходит нам на помощь. Он предоставляет<strong>генераторы множеств</strong>и<strong>генераторы словарей</strong>, которые мы изучим в этом уроке.</p>
5 <h2>Генераторы множеств</h2>
5 <h2>Генераторы множеств</h2>
6 <p>С этими генераторами все максимально просто. Нужно всего два действия:</p>
6 <p>С этими генераторами все максимально просто. Нужно всего два действия:</p>
7 <ul><li>Взять выражение, описывающее генератор списка</li>
7 <ul><li>Взять выражение, описывающее генератор списка</li>
8 <li>Заменить в нем квадратные скобки на фигурные</li>
8 <li>Заменить в нем квадратные скобки на фигурные</li>
9 </ul><p>Посмотрим, как это работает:</p>
9 </ul><p>Посмотрим, как это работает:</p>
10 <p>Вы получаете все те же возможности, которые доступны для генерации списков. Есть и дополнительное преимущество - при создании множества можно еще и проследить за тем, чтобы в список не попали дубли. Так можно сэкономить память.</p>
10 <p>Вы получаете все те же возможности, которые доступны для генерации списков. Есть и дополнительное преимущество - при создании множества можно еще и проследить за тем, чтобы в список не попали дубли. Так можно сэкономить память.</p>
11 <h2>Генераторы словарей</h2>
11 <h2>Генераторы словарей</h2>
12 <p>Генераторы словарей выглядят очень похоже на генераторы множеств. Разница заключается в том, как описывается элемент словаря.</p>
12 <p>Генераторы словарей выглядят очень похоже на генераторы множеств. Разница заключается в том, как описывается элемент словаря.</p>
13 <p>Нужно сгенерировать не только значение, но и ключ. При этом ключ надо указать через двоеточие - так же, как при написании литерала словаря.</p>
13 <p>Нужно сгенерировать не только значение, но и ключ. При этом ключ надо указать через двоеточие - так же, как при написании литерала словаря.</p>
14 <p>Посмотрим на примере:</p>
14 <p>Посмотрим на примере:</p>
15 <p>Обратите внимание, что в этом примере ключ 'l'имеет значение 10. Посмотрим, какие значения имели char и pos во время генерации. Для простоты будем смотреть только на позиции символа 'l':</p>
15 <p>Обратите внимание, что в этом примере ключ 'l'имеет значение 10. Посмотрим, какие значения имели char и pos во время генерации. Для простоты будем смотреть только на позиции символа 'l':</p>
16 <p>Как можно заметить, 'l' встречается в исходной строке три раза - в последнем случае как раз в позиции 10. При генерации словаря используется последнее значение для каждого из ключей, будто словарь был заполнен в подобном цикле:</p>
16 <p>Как можно заметить, 'l' встречается в исходной строке три раза - в последнем случае как раз в позиции 10. При генерации словаря используется последнее значение для каждого из ключей, будто словарь был заполнен в подобном цикле:</p>
17 <p>В примере выше порядок ключей получается тот же самый - это порядок первого появления соответствующего символа в строке. Последующие перезаписи значений этот порядок не изменят. Словари в Python запоминают порядок добавления ключей, но не порядок последующих изменений значений.</p>
17 <p>В примере выше порядок ключей получается тот же самый - это порядок первого появления соответствующего символа в строке. Последующие перезаписи значений этот порядок не изменят. Словари в Python запоминают порядок добавления ключей, но не порядок последующих изменений значений.</p>
18 <p>В генераторах множеств в результирующее множество попадают первые уникальные значения. В большинстве случаев это не критично, но помнить об этом стоит.</p>
18 <p>В генераторах множеств в результирующее множество попадают первые уникальные значения. В большинстве случаев это не критично, но помнить об этом стоит.</p>