我使用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