从发生器打印物品

我正在练习打印由发电机功能产生的物品。

这工作得很好:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b


sumfib = 0
for i in fibonacci():
    if i >= 4000000:
        break
    elif i % 2 == 0:
        sumfib += i

print(sumfib)

但是下面的代码产生了:

list1 = ['f', 'o', 'o', 'b', 'a', 'r']
list2 = ['hello', 'world']
list3 = ['1', '2', '3', '4']


def ziplike(*args):
    x = zip(*args)
    yield x


for item in ziplike(list1, list2, list3):
    print(item)

我想要打印的是每个列表中的每个项目,并在最短列表耗尽时耗尽。 我让它在没有发电机的情况下工作,但我正在试图将我的手包裹在发电机上。

我想打印这个:

f
hello
1
o
world
2

每个中的第一个元素,然后是第二个元素等,直到最短的列表被耗尽。 我希望能够提供任意数量的迭代,因此我使用*args

注我的工作,非发电机变体使用itertools:

newlist = list(zip(list1, list2, list3))

temp = list(itertools.chain(*newlist))

如果可能,我试图避免这种情况。


你可以让你的非生成器版本也可以工作,只是避免使用list()调用并使用itertools.chain.from_iterable()

newlist = zip(list1, list2, list3)
temp = itertools.chain.from_iterable(newlist)

至于你的实施; 你得到了整个zip()结果,而不是个别的元素。 委托给zip()与迭代器yield from

def ziplike(*args):
    x = zip(*args)
    yield from x

这仍然从zip()调用产生行元组; 你需要遍历每个包含的元组:

def ziplike(*args):
    x = zip(*args)
    for tup in x:
        yield from tup

链接元组内容。

后者的演示:

>>> list1 = ['f', 'o', 'o', 'b', 'a', 'r']
>>> list2 = ['hello', 'world']
>>> list3 = ['1', '2', '3', '4']
>>> def ziplike(*args):
...     x = zip(*args)
...     for tup in x:
...         yield from tup
...
>>> for item in ziplike(list1, list2, list3):
...     print(item)
...
f
hello
1
o
world
2

产生x产生整个迭代。 你需要从x屈服。

yield from x
链接地址: http://www.djcxy.com/p/53477.html

上一篇: Printing items out of a generator

下一篇: How yield catches StopIteration exception?