Как достать значения из генератора используя range+next для примера с None

Всем доброго времени, столкнулся с проблемой - нужно написать цикл с range+next для примера с none

Само задание:

Напишите функцию, которая создает генератор потока для заданного итерируемого объекта (списка, генератора и т. д.), элементы которого содержат позицию и значение и отсортированы по порядку появления. Генератор потока должен быть равен исходному потоку (без позиции), но промежутки должны быть заполнены нулями.

Например:

>>> gen = gen_stream(9,[(4,111),(7,12)])
>>> list(gen) [0, 0, 0, 0, 111, 0, 0, 12, 0]

первый элемент имеет нулевой индекс, поэтому 111 находится на пятой позиции, 12 — на 8-й позиции т.е. 2 значащих элемента имеют индексы 4 и 7, все остальные элементы заполнены нулями. Для упрощения элементы сортируются (то есть элемент с более низкой позицией должен предшествовать элементу с более высоким номером) в исходном потоке.

Первый параметр может быть None, в этом случае поток должен быть бесконечным, например. бесконечный поток нулей:

>>> gen_stream(None, [])

следующий поток начинается с 0, 0, 0, 0, 111, 0, 0, 12, ..., затем бесконечно генерирует нули:

>>> gen_stream(None, [(4,111),(7,12)])

Функция также должна поддерживать настраиваемый экстрактор значения позиции для более сложных случаев, например.

def day_extractor(x):
  months = [31,28,31,30,31,31,30,31,30,31,30,31]
  acc = sum(months[:x[1]-1]) + x[0] - 1
  return (acc, x[2])

Далее

>>> осадки_дней = [(3,1,4),(5,2,6)]
>>> list(gen_stream(59,precipitation_days,day_extractor))

#59: январь и февраль для ограничения вывода [0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0] Формат осадки_дней следующий: (д,м,мм), где д - день в месяце, м - месяц, мм - осадки в миллиметрах Итак, в примере: (3,1,4) - 3 января осадков: 4 мм (5,2,6) - 5 февраля осадков: 6 мм Экстрактор передается как необязательный третий параметр со значением по умолчанию — лямбда-функция, которая обрабатывает пары (позиция, значение), как в первом примере.

Вот мой код

def gen_stream(total, sorted_iterable, extractor=lambda x: x):
    elem_iter = map(extractor, sorted_iterable)
    pos, val = next(elem_iter, (None, None))
    a = 0
    while total is None or a < total:
        if a == pos:
            yield val
            pos, val = next(elem_iter, (None, None))
        else:
            yield 0
        a += 1


precipitation_days = [(3, 1, 4), (5, 2, 6)]


def day_extractor(x):
    months = [31, 28, 31, 30, 31, 31, 30, 31, 30, 31, 30, 31]
    acc = sum(months[:x[1] - 1]) + x[0] - 1
    return acc, x[2]


list_gens = [
    gen_stream(9, [(4, 111), (7, 12)]),
    gen_stream(None, []),
    gen_stream(None, [(4, 111), (7, 12)]),
    gen_stream(59, precipitation_days, day_extractor)
]


for gens in list_gens:
    for cnt, v in enumerate(gens):
        print(v, end=' ')
        if cnt > 59:
            break
    print()

Вопрос - как переделать последний цикл for gens in list_gens: for cnt, v in enumerate(gens): чтобы доставать значения из генератора, который выдает бесконечные значения - обязательно нужно использовать range и next


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