Как можно переделать код с itertools на обычный код без import и сделать функцию через yield(Питон)

Есть код

from itertools import chain, cycle, compress


def generate_step(a, *steps):
    selections = chain.from_iterable(
        [0] * (step - 1) + [1] for step in cycle(steps)
    )
    return compress(a, selections)


a = [1, 2, 3, 4, 5, 6, 7]
b = generate_step(a, 1, 2)
print(next(b))
print(next(b))
print(next(b))
print(next(b))
print(next(b))

Вывод:

1
3
4
6
7

Он работает, но мне нужно, чтобы он работал без использования import. В моём коде это не генератор, потому что нет yield, мне также нужно, чтобы в переработанном коде был yield вместо return. И соответственно в конце нельзя выходить за границу списка.


Ответы (1 шт):

Автор решения: Roman Konoval

Как-то так:

def generate_step(a, *steps):
    i = 0                                      # начинаем с первого элемента
    step_index = 1                             # начинаем с шага2, не очень логично,
                                               # но так указано в примере 
    while i < len(a):                          # пока не закончатся элементы во входном списке
        yield a[i]                                  # генерируем текущий элемент
        i += steps[step_index]                      # переходим к следующему элементу
        step_index = (step_index + 1) % len(steps)  # переходим к следующему шагу
→ Ссылка