在下面的代码中我想要测试zip()
方法。在一个例子中,我迭代b(zip输出),第二个转换b到set.but当我转换b设置奇怪的事情发生。在b中迭代的那些,打印输出是空列表。但是当我评论c = set(b)
和print(c)
输出是否正确时会发生什么?为什么?你能帮我解释一下吗?
l1 = range(10)
l2 = range(10)
b = zip(l1,l2)
c = set(b)
print(c)
result = [(x,y) for x,y in b]
print(len(result))
答案 0 :(得分:1)
zip
是一个耗尽的迭代器。
根据documentation,zip
相当于下面的生成器函数(请注意yield
语句):
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
result.append(elem)
yield tuple(result)
您可以通过多种方式耗尽发电机。例如,通过在其上调用list
或set
,或者应用next
直到它耗尽。
由于您已在生成器上调用set
,因此其内容已清空且不再可迭代,除非它们已通过耗尽函数存储。
您可以在exhausted iterators - what to do about them?中找到一些示例和解决方案。特别是,itertools.tee
可以方便地复制迭代器,以便您可以“重用”它。