如何创建一个生成器函数来生成特定数量的值?

时间:2020-05-28 16:41:02

标签: python generator

我正在尝试创建一个接受1或1+个参数的生成器函数。在其他可迭代对象不再产生值之后,它应该返回具有最多值的可迭代对象的剩余过剩值。

例如:

 for i in func('dfg', 'dfghjk', [1,2]):
    print(i)

prints -> h
          j
          k

因为具有第二大值的参数'dfg'停止在3处产生值。 值最多的参数“ dfghjk”将产生“ hjk”(剩余值)。

这里的难点是,可迭代对象可能是有限的,也可能不是有限的,所以我无法计算参数的长度或将其添加到其他数据结构中。

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:0)

为解决您的问题,我将尝试手动耗尽所有迭代器,直到只剩下一个。

def foo(*iterables):
    iterators = [iter(x) for x in iterables]
    while len(iterators) > 1:
        for idx, it in enumerate(iterators[:]):
            try:
                peek = next(it)
            except StopIteration:
                # remove the iterator when exhausted
                iterators.pop(idx)

    yield peek
    yield from iterators[0]

请注意,要使其正常工作,您需要确保可迭代对象确实是迭代器(使用iter进行转换)。您还需要存储从迭代器获得的最后一个元素。注意,因为我们仅使用迭代器接口,所以无限迭代器可以正常工作:

>>> it = func([1], itertools.count(), [2,2])
>>> for _ in range(3): print(next(it))
2
3
4
相关问题