我有:蟒蛇:重啓循環
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
但是,這似乎並沒有工作。有沒有辦法重新啓動該循環?
感謝
我有:蟒蛇:重啓循環
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
但是,這似乎並沒有工作。有沒有辦法重新啓動該循環?
感謝
您可能需要考慮在邏輯適用的情況下使用不同類型的循環,因爲這是最明顯的答案。
也許是:
i=2
while i < n:
if something:
do something
i += 1
else:
do something else
i = 2 #restart the loop
從內環路是不可能做你所期望的更改索引變量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
循環相同)。
只是想後,這可能是更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()
這不是乾淨,但仍保留寫入循環迭代器本身的能力。
通常,當你認爲你想這樣做,你的算法是錯誤的,你應該更乾淨地重寫它。可能你真正想做的是用一個發生器/協程來代替。但至少可以。
下面是使用的發電機的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
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循環。
感謝佩羅,沒有太多的蟒蛇人......但。 – gnomed 2009-01-29 18:49:07