Функции-генераторы модуля itertools

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

На этом занятии мы с вами рассмотрим различные функции модуля itertools, предназначенные для генерации бесконечных последовательностей. И первая функция count(), формирует последовательность чисел, начиная с некоторого указанного стартового значения:

count(start=0, step=1)

В самом простом варианте ей можно воспользоваться так:

from itertools import count
 
for x in count():
    print(x, end=" ")
    if x > 10:
        break

В консоли увидим значения:

0 1 2 3 4 5 6 7 8 9 10 11

При использовании функции count() всегда следует помнить, что это бесконечный генератор числовых значений. Поэтому условие внутри цикла строго обязательно, иначе программа будет работать непрерывно.

Функция count() возвращает итератор:

it = count()

который затем можно перебирать функцией next:

next(it)  # 0
next(it)  # 1
next(it)  # 2

Обычно на практике генератор count используют совместно с какой-либо другой ограниченной коллекцией. Например, так:

alpha = tuple("python")
 
for x in zip(count(1), alpha):
    print(x, end=" ")

В консоли увидим следующие кортежи:

(1, 'p') (2, 'y') (3, 't') (4, 'h') (5, 'o') (6, 'n')

Или так:

syms = list("ABCDEFGHIJ")
for x in zip(syms, count(-5, 2)):
    print(x, end=" ")

Получим:

('A', -5) ('B', -3) ('C', -1) ('D', 1) ('E', 3) ('F', 5) ('G', 7) ('H', 9) ('I', 11) ('J', 13)

Помимо целых значений генератор count может выдавать и вещественные числа. Например:

res = list(zip(alpha, count(0, 0.5)))
print(res)  # [('p', 0), ('y', 0.5), ('t', 1.0), ('h', 1.5), ('o', 2.0), ('n', 2.5)]

Также можно использовать отрицательные шаги:

items = ['apple', 'banana', 'cherry', 'grapes', 'orange']
id = count(2, -1)
for x in items:
    print(f"{next(id)}: {x}")

Получим:

2: apple
1: banana
0: cherry
-1: grapes
-2: orange

Функция cycle()

Следующая функция cycle() предназначена для многократного повторения элементов итерируемого объекта. Она формирует итератор, который непрерывно возвращает элементы заданной коллекции один за другим по циклу.

Используется функция cycle() очень просто. Пусть у нас имеется список цветов:

colors = ["красный", "зеленый", "синий"]

И нам требуется их по порядку все время перебирать. Для этого сформируем итератор:

it_cycle = cycle(colors)

и переберем его ровно 10 раз:

for _ in range(10):
    print(next(it_cycle), end=" ")

получим:

красный зеленый синий красный зеленый синий красный зеленый синий красный

В качестве перебираемой коллекции в cycle() может выступать любой итерируемый объект: список, множество, словарь, кортеж, другой генератор. Например, сформируем генератор:

g = (x ** 2 for x in range(1, 5))

и с помощью cycle переберем его 10 раз:

it_cycle = cycle(g)
for i, x in enumerate(cycle(g)):
    print(x, end=" ")
    if i >= 10:
        break

Получим результат:

1 4 9 16 1 4 9 16 1 4 9

Функция repeat()

Следующая функция repeat() позволяет многократно (либо бесконечно) повторять один и тот же объект (значение). Для создания итератора такого вида используется следующий синтаксис:

itertools.repeat(object[, times])

  • object – любой объект (значение), которое будет возвращаться на каждой итерации;
  • times – необязательный аргумент, определяющий количество повторений (по умолчанию итератор генерирует бесконечную последовательность).

В самом простом варианте ей можно воспользоваться так:

it_repeat = repeat('python', 3)
for x in it_repeat:
    print(x)

Строка 'python' будет повторена три раза:

python
python
python

Генератор repeat(), например, удобно использовать для задания начальных значений какой-либо коллекции:

zeros = list(repeat(0, 10))  # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
d = dict(zip(count(), repeat(None, 5)))  # {0: None, 1: None, 2: None, 3: None, 4: None}

Или создать цепочку из нескольких повторяющихся значений:

data = tuple(itertools.chain(repeat('A', 3), repeat('B', 2), repeat('C', 1)))  # ('A', 'A', 'A', 'B', 'B', 'C')

Таким образом, функция repeat() позволяет заметно упростить работу с повторяющимися объектами, снижая потребление памяти и ускоряя выполнение программы.

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Видео по теме