簡體   English   中英

python:重啟循環

[英]python: restarting a 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循環相同)。

以下是使用生成器的send()方法的示例:

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

只是想發布一個可能更普遍可用的替代方案。 大多數現有解決方案使用循環索引來避免這種情況。 但是你不必使用索引 - 這里的關鍵是與for循環不同,循環變量被隱藏,循環變量被暴露。

您可以使用迭代器/生成器執行非常類似的操作:

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()

它不是那么干凈,但仍然保留了寫入循環迭代器本身的能力。

通常 ,當您認為要執行此操作時,您的算法是錯誤的,您應該更干凈地重寫它。 你真正想要做的就是使用生成器/協同程序。 但這至少是可能的。

a = ['1', '2', '3']
ls = []
count = False

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

循環時重啟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM