我使用iter(range())
,但我也需要使用结果的两倍,假设j=iter(range(n,2n)
)使用range()函数时,是否可以调用结果?
next(j)
将N,但后来我需要再次某些next(j)
不挺身而出,这是可能的,无需进一步的并发症?
我使用iter(range())
,但我也需要使用结果的两倍,假设j=iter(range(n,2n)
)使用range()函数时,是否可以调用结果?
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
如果你的用例需要的是放眼望去,看到this question一些不错的解决方案。
一种方法是明确地得到两个迭代器,使用itertools.tee
:
iter1,iter2 = itertools.tee(iter(range(5,10)))
next(iter1)
Out[15]: 5
next(iter2)
Out[16]: 5
这可能取决于你在做什么更灵活,但缺点是,你需要确保你会从两个迭代器中消耗1比1。
但说实话,我不认为我曾经发现我自己这样做与range
。当您指定next()
给一个变量,您可以访问它很多次,只要你想(一拉for i in range
),所以...
或者您可以使用发电机声明
for i in (j for j in range(n, 2 * n) for k in range(2)):
pass
你可以使用zip
:
for a, b in zip(range(...), range(...)):
...
我相信shx2's answer是正确答案的问题。
然而,在情况下
然后这里是一个不同的发电机,可以通过send()
builtin对反馈作出反应。
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
结果发电机。由于任何send()
都将导致发生器也立即运行到下一个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