Введение
В этой лабораторной работе вы познакомитесь с генераторами (comprehensions) в Python — специальным синтаксисом, который позволяет очень лаконично создавать структуры данных, такие как списки (lists), множества (sets) и словари (dictionaries) на основе других итерируемых объектов (iterables). Генераторы невероятно полезны при работе с одним или двумя уровнями вложенных циклов for, делая ваш код более читаемым и часто более эффективным.
Вы начнете с наиболее распространенного типа — списковых генераторов (list comprehensions) — и увидите, как они соотносятся с традиционными циклами for. Затем вы научитесь добавлять условную логику для фильтрации или преобразования элементов. Наконец, вы увидите, как те же принципы применяются при создании множеств и словарей.
Генератор списка (List Comprehension)
На этом шаге вы изучите базовый синтаксис генерации списков (list comprehensions) как лаконичный способ создания списков из других итерируемых объектов (iterables). Мы сравним традиционный подход с использованием цикла for с более элегантным синтаксисом генерации списков.
Примечание: Если вы не знакомы с использованием WebIDE (похожего на VS Code), изучите его сначала в этой лаборатории.
Сначала давайте посмотрим, как мы создали бы новый список из существующего с помощью стандартного цикла for.
Откройте файл main.py в проводнике файлов слева. Скопируйте и вставьте следующий код в файл:
## Традиционный подход: создание списка с использованием цикла for
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = []
for n in names:
new_list.append(n)
print(new_list)
Чтобы запустить код, откройте терминал, нажав на значок + на панели терминала и выбрав "New Terminal". Затем выполните следующую команду:
python3 main.py
Вы увидите следующий вывод:
['Charles', 'Susan', 'Patrick', 'George']
Теперь давайте достигнем того же результата, используя генерацию списка. Базовый синтаксис: [expression for item in iterable].
Замените содержимое main.py следующим кодом:
## Генерация списка: лаконичный способ создания нового списка
## Синтаксис: [expression for item in iterable]
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = [n for n in names] ## Создание списка со всеми именами
print(new_list)
Снова запустите скрипт:
python3 main.py
Вывод идентичен, но код намного короче и более описателен.
['Charles', 'Susan', 'Patrick', 'George']
Генерация списков также может обрабатывать вложенные циклы. Например, чтобы создать список кортежей (tuples) из двух диапазонов (ranges), вы можете сделать следующее.
Обновите ваш файл main.py этим кодом и запустите его.
## Вложенная генерация списка: создание кортежей из двух диапазонов
## Эквивалентно вложенным циклам for
n = [(a, b) for a in range(1, 3) for b in range(1, 3)]
print(n)
Запустите скрипт:
python3 main.py
Вывод будет списком всех возможных комбинаций кортежей:
[(1, 1), (1, 2), (2, 1), (2, 2)]
Добавление условий
На этом шаге вы узнаете, как включать условную логику в списковые генераторы. Вы научитесь фильтровать элементы с помощью оператора if и применять условные выражения к каждому элементу, используя структуру if-else.
Предположим, мы хотим создать новый список, содержащий только имена, начинающиеся с буквы 'C'. С помощью традиционного цикла for вы бы добавили оператор if внутрь цикла.
Обновите ваш main.py следующим кодом:
## Традиционный подход: фильтрация с условием if
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = []
for n in names:
if n.startswith('C'): ## Фильтруем имена, начинающиеся с 'C'
new_list.append(n)
print(new_list)
Запустите скрипт, чтобы увидеть результат:
python3 main.py
Вывод:
['Charles', 'Carol']
Чтобы сделать это с помощью спискового генератора, вы добавляете оператор if в конец. Синтаксис: [expression for item in iterable if condition].
Попробуйте это в вашем main.py:
## Списковый генератор с условием: фильтрация элементов
## Синтаксис: [expression for item in iterable if condition]
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = [n for n in names if n.startswith('C')]
print(new_list)
Запустите его, и вы получите тот же отфильтрованный список:
python3 main.py
Вывод:
['Charles', 'Carol']
Вы также можете использовать оператор if-else для выполнения условного действия над каждым элементом. В этом случае выражение if-else располагается перед циклом for. Синтаксис: [expression_if_true if condition else expression_if_false for item in iterable].
Давайте создадим новый список, который удваивает четные числа, но оставляет нечетные числа без изменений. Обновите main.py следующим кодом и запустите его.
## Списковый генератор с if-else: условное выражение
## Синтаксис: [expression_if_true if condition else expression_if_false for item in iterable]
nums = [1, 2, 3, 4, 5, 6]
new_list = [num*2 if num % 2 == 0 else num for num in nums] ## Удваиваем четные числа
print(new_list)
Запустите скрипт:
python3 main.py
Вывод показывает, что удвоены только четные числа:
[1, 4, 3, 8, 5, 12]
Генератор множества (Set Comprehension)
На этом шаге вы узнаете, как применять синтаксис генераторов для создания множеств (sets). Основы генераторов списков (list comprehensions) применимы и к множествам (sets), и к словарям (dictionaries).
Генераторы множеств очень похожи на генераторы списков. Основное отличие заключается в том, что они используют фигурные скобки {} вместо квадратных [] и создают множество — неупорядоченную коллекцию уникальных элементов.
Синтаксис: {expression for item in iterable}.
Давайте создадим множество из другого множества, преобразовав все его строковые элементы в верхний регистр. Обновите ваш файл main.py следующим кодом:
## Генератор множеств: создание множества с использованием синтаксиса генератора
## Синтаксис: {expression for item in iterable}
b = {"abc", "def"}
upper_set = {s.upper() for s in b} ## Преобразуем все строки в верхний регистр
print(upper_set)
Теперь запустите скрипт:
python3 main.py
Вывод будет новым множеством, содержащим строки в верхнем регистре. Обратите внимание, что поскольку множества неупорядочены, порядок элементов в выводе может отличаться.
{'DEF', 'ABC'}
Если бы исходный итерируемый объект содержал дублирующиеся элементы, результирующее множество содержало бы только уникальные элементы, так как множества автоматически отбрасывают дубликаты.
Генератор словаря (Dict Comprehension)
На этом шаге вы узнаете, как конструировать словари с помощью генераторов словарей. Подобно генераторам множеств, они также используют фигурные скобки {}, но требуют пары ключ-значение, разделенной двоеточием.
Синтаксис: {key_expression: value_expression for item in iterable}.
Распространенный сценарий использования — создание нового словаря путем преобразования или обмена пар ключ-значение существующего словаря. Давайте попробуем поменять местами ключи и значения словаря.
Обновите ваш файл main.py следующим кодом:
## Генератор словаря: обмен ключей и значений
## Синтаксис: {key_expression: value_expression for item in iterable}
c = {'name': 'Pooka', 'age': 5}
swapped_dict = {v: k for k, v in c.items()} ## Меняем пары ключ-значение местами
print(swapped_dict)
Запустите скрипт:
python3 main.py
Вывод будет новым словарем, где исходные значения стали ключами, а исходные ключи — значениями.
{'Pooka': 'name', 5: 'age'}
Вы также можете использовать генераторы для создания других типов данных из словарей. Например, вот как можно использовать генератор списка (list comprehension) для создания списка отформатированных строк из элементов словаря.
Замените код в main.py этим примером и запустите его:
## Генератор списка из словаря: создание отформатированных строк
c = {'name': 'Pooka', 'age': 5}
formatted_list = ["{}:{}".format(k.upper(), v) for k, v in c.items()] ## Форматируем как "KEY:value"
print(formatted_list)
Запустите скрипт:
python3 main.py
В результате будет получен список строк, а не словарь.
['NAME:Pooka', 'AGE:5']
Это демонстрирует гибкость использования генераторов для обработки и преобразования различных структур данных. Для вашего заключительного задания на этом шаге убедитесь, что ваш main.py содержит код для обмена ключей и значений словаря.
Резюме
В этой лабораторной работе вы узнали, как использовать мощный синтаксис генераторов Python для создания списков, множеств и словарей лаконичным и читаемым способом.
Вы начали с генераторов списков (list comprehensions), увидев, как они предоставляют более элегантную альтернативу традиционным циклам for. Затем вы узнали, как добавлять условную логику, используя завершающий if для фильтрации и выражение if-else для преобразования элементов. Наконец, вы увидели, как те же принципы применяются к генераторам множеств (set comprehensions) и словарей (dict comprehensions), используя фигурные скобки {} для построения множеств уникальных элементов и словарей пар ключ-значение.
Генераторы являются фундаментальной частью идиоматического кода на Python. Освоение их сделает ваш код более эффективным и элегантным. Продолжайте практиковаться, чтобы они стали естественной частью вашего инструментария программирования на Python.



