从发生器打印物品
我正在练习打印由发电机功能产生的物品。
这工作得很好:
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