2013-10-24 64 views

回答

2

你可以隨便寫一個發電機,其重複給定迭代的每個元素兩次:

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一些不錯的解決方案。

0

一種方法是明確地得到兩個迭代器,使用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),所以...

0

或者您可以使用發電機聲明

for i in (j for j in range(n, 2 * n) for k in range(2)): 
    pass 
0

你可以使用zip

for a, b in zip(range(...), range(...)): 
    ... 
0

我相信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 
相關問題