【发布时间】:2021-03-06 01:43:52
【问题描述】:
我有两个可迭代的对象并想要链接它们,即将它们连接起来。具体来说,可迭代的对象返回一个迭代器,这可以重复。这两个迭代器的连接应该是一个迭代器,每次从输入中获取两个迭代器并返回连接的迭代器。我对 Python 还是很陌生,发现它非常微妙而且非常困难——不像每个人都告诉我的“简单”语言。但我原以为会有一种简单的方法来完成这项特定任务。来自 itertools 的注释链不起作用:
from itertools import chain
def i():
n = 0
while n < 2:
yield n
n = n+1
def j():
m = 0
while m < 3:
yield m
m = m+1
print("iterating i")
for x in i():
print(x)
print("iterating i again")
for x in i():
print(x)
k = chain(i(),j())
print("iterating k")
for x in k:
print(x)
print("iterating k again")
for y in k:
print(y)
print("but it's empty :(")
给予
iterating i
0
1
iterating i again
0
1
iterating k
0
1
0
1
2
iterating k again
but it's empty :(
这里的链似乎对提供迭代器的迭代器进行操作,但我想链接两个提供迭代器的迭代器。
对初始 cmets 的回应:
我不认为这是关于生成器的问题:我只是用生成器来说明。
有些人说可迭代的东西已经用完了。但据我了解,这是不对的:iterable 总是可以创建新的迭代器。您可以看到 i() 可以重复。一个特定的迭代器已用尽。这个问题是关于iterator和iterable的区别。
最后,我当然可以将数据保存在一个列表中,并在该列表上进行多次迭代。但我想让你想象一下,2 和 3 太大了,这是不切实际的。
提前致谢:)
【问题讨论】:
-
第二次用尽了可迭代对象
-
它不仅仅是一个可迭代的,它是一个 ganarator...你最好看看它的具体用例..
-
不...我会在问题中添加一些内容以明确我想要什么。
-
Python 会将任何带有
yield表达式的函数视为生成器函数,并且此生成器是一次性迭代器。用你自己的话You can see that i() can be repeated,这是因为你从函数i生成了一个全新的迭代器。要证明这确实是一次性迭代器,请尝试以下操作:f = i()现在循环两次,第二次循环不会产生任何结果。