我正在使用 iter(range())
,但我还需要使用两次结果,假设j=iter(range(n,2n)
)
next(j)
会是n,但是我需要next(j)
再次确定而不向前迈进,这可能没有进一步的复杂性吗?
我正在使用 iter(range())
,但我还需要使用两次结果,假设j=iter(range(n,2n)
)
next(j)
会是n,但是我需要next(j)
再次确定而不向前迈进,这可能没有进一步的复杂性吗?
您可以轻松编写一个生成器,将给定迭代器的每个元素重复两次:
def repeat_iter(iter, n = 2):
for x in iter:
for i in range(n):
yield x
for x in repeat_iter(range(n)):
print x
如果您的用例需要展望未来,请参阅此问题以获取一些不错的解决方案。
你可以使用zip
:
for a, b in zip(range(...), range(...)):
...
一种方法是显式获取两个迭代器,使用itertools.tee
:
iter1,iter2 = itertools.tee(iter(range(5,10)))
next(iter1)
Out[15]: 5
next(iter2)
Out[16]: 5
这可以更灵活,具体取决于您正在做什么,但缺点是您需要确保从两个迭代器中进行一对一的消费。
但老实说,我认为我从来没有发现自己这样做过range
。当您分配next()
给一个变量时,您可以根据需要多次访问它(a la for i in range
),所以...
或者您可以使用生成器语句
for i in (j for j in range(n, 2 * n) for k in range(2)):
pass
我相信shx2 的答案是该问题的正确答案。
然而,在这种情况下
send()
那么这里有一个不同的生成器,可以通过内置对反馈做出反应。
def iter_with_standstill(iter):
standstill = False
for x in iter:
while True:
pause = yield x
if pause is not None:
standstill = pause
yield None
if not standstill:
break
使用的技巧是任何调用generator.send(value)
都会将 发送回value
生成器,生成器接收它作为yield
. 由于 anysend()
会导致生成器也立即运行到下一个yield()
,我们yield(None)
在这里将控制权立即交还给调用代码。这种方法send()
真正做到了单向操作。
以下是如何使用它:
orig = range(10)
paused = iter_with_standstill(orig)
waiting = None
for x in paused:
if x in [4,7]:
if waiting is None:
waiting = 3
waiting -= 1
if waiting > 0:
paused.send(True)
else:
paused.send(False)
waiting = None
print(x, end=' ')
print()
变量的全部意义在于waiting
在值 4 和 7 处暂停,然后将这些值重复迭代 3 次。输出如下所示:
0 1 2 3 4 4 4 5 6 7 7 7 8 9