Comprehensions и встроенные map, filter, zip, enumerate

Вопрос про идиоматичный Python: comprehension-ы и функциональные встроенные функции.

Comprehension — компактный синтаксис построения коллекции из итерируемого: [выражение for x in iterable if условие].

List, dict и set comprehension

Чёткий ответ. Comprehension заменяет цикл с append одной строкой и работает быстрее. Скобки задают тип результата: [] — список, {} с парой — словарь, {} с элементом — множество.

squares = [x * x for x in range(5)]
evens = [x for x in range(10) if x % 2 == 0]
square_map = {x: x * x for x in range(4)}
remainders = {x % 3 for x in range(10)}

print(squares)
print(evens)
print(square_map)
print(remainders)

Вывод:

[0, 1, 4, 9, 16]
[0, 2, 4, 6, 8]
{0: 0, 1: 1, 2: 4, 3: 9}
{0, 1, 2}

map и filter

map(func, iter) применяет функцию к каждому элементу, filter(func, iter) оставляет те, для которых функция истинна. Оба ленивые — возвращают итераторы, поэтому оборачиваем в list.

nums = [1, 2, 3, 4, 5]
print(list(map(lambda x: x * x, nums)))
print(list(filter(lambda x: x % 2 == 0, nums)))
# эквивалент через comprehension — обычно читабельнее
print([x * x for x in nums])
print([x for x in nums if x % 2 == 0])

Вывод:

[1, 4, 9, 16, 25]
[2, 4]
[1, 4, 9, 16, 25]
[2, 4]

zip и enumerate

zip «сшивает» несколько последовательностей в пары, enumerate добавляет индекс к элементам. Эти две функции — частый ответ на вопрос «как пройти по двум спискам сразу» и «как получить индекс в цикле».

names = ["Аня", "Боб", "Ева"]
ages = [30, 25, 35]
for name, age in zip(names, ages):
    print(f"{name}: {age}")

for i, name in enumerate(names, start=1):
    print(i, name)

Вывод:

Аня: 30
Боб: 25
Ева: 35
1 Аня
2 Боб
3 Ева

Итог

  • Comprehension — компактная и быстрая замена циклу с append; тип задаётся скобками.
  • map/filter применяют/отбирают; comprehension обычно читабельнее.
  • zip сшивает последовательности, enumerate добавляет индекс — вместо ручного счётчика.
Проверьте себя
1. Что построит {x: x*x for x in range(3)}?
AМножество
BСписок
CСловарь {0:0, 1:1, 2:4}
DКортеж
2. Что делает enumerate?
AСортирует элементы
BДобавляет индекс к каждому элементу при итерации
CСшивает два списка
DФильтрует элементы
3. Что делает zip(['a','b'], [1,2])?
A[('a',1), ('b',2)]
B['a','b',1,2]
C{'a':1,'b':2}
DОшибку
Поддержать проект