2009-01-29 171 views
12

我有:蟒蛇:重啓循環

for i in range(2,n): 
    if(something): 
     do something 
    else: 
     do something else 
     i = 2 **restart the loop 

但是,這似乎並沒有工作。有沒有辦法重新啓動該循環?

感謝

回答

25

您可能需要考慮在邏輯適用的情況下使用不同類型的循環,因爲這是最明顯的答案。

也許是:

i=2 
while i < n: 
    if something: 
     do something 
     i += 1 
    else: 
     do something else 
     i = 2 #restart the loop 
+1

感謝佩羅,沒有太多的蟒蛇人......但。 – gnomed 2009-01-29 18:49:07

10

從內環路是不可能做你所期望的更改索引變量i。您可能需要使用while循環,並自行控制循環變量的遞增。每一次在for循環周圍,i都會重新分配range()的下一個值。因此,像:

i = 2 
while i < n: 
    if(something): 
     do something 
    else: 
     do something else 
     i = 2 # restart the loop 
     continue 
    i += 1 

在我的例子中,continue語句跳轉回升到循環的頂部,跳過該次迭代的i += 1聲明。否則,i將按照您的預期遞增(與for循環相同)。

0

只是想後,這可能是更genearally可用的替代品。大多數現有的解決方案都使用循環索引來避免這種情況。但是你不必使用索引 - 這裏的關鍵是不像循環變量被隱藏的循環那樣,循環變量是暴露的。

你可以用迭代器/發電機做的非常類似的事情:

x = [1,2,3,4,5,6] 
xi = iter(x) 
ival = xi.next() 
while not exit_condition(ival): 
    # Do some ival stuff 
    if ival == 4: 
     xi = iter(x) 
    ival = xi.next() 

這不是乾淨,但仍保留寫入循環迭代器本身的能力。

通常,當你認爲你想這樣做,你的算法是錯誤的,你應該更乾淨地重寫它。可能你真正想做的是用一個發生器/協程來代替。但至少可以。

3

下面是使用的發電機的send() method一個例子:

def restartable(seq): 
    while True: 
     for item in seq: 
      restart = yield item 
      if restart: 
       break 
     else: 
      raise StopIteration 

實例應用:

x = [1, 2, 3, 4, 5] 
total = 0 
r = restartable(x) 
for item in r: 
    if item == 5 and total < 100: 
     total += r.send(True) 
    else: 
     total += item 
0
a = ['1', '2', '3'] 
ls = [] 
count = False 

while ls != a : 
    print(a[count]) 
    if a[count] != a[-1] : 
     count = count + 1 
    else : 
     count = False 

重新啓動while循環。