2014-01-22 34 views
19

我正在使用多個嵌套for循環。在最後一個循環中有一個if聲明。當評估爲True時,應該停止所有for循環,但這不會發生。它只有break s出於最內層的for循環,並且比它繼續進行。如果遇到break聲明,我需要所有循環停止。Python - 所有循環中的「break」

我的代碼:

for i in range(1, 1001): 
    for i2 in range(i, 1001): 
     for i3 in range(i2, 1001): 
      if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000: 
       print i*i2*i3 
       break 
+3

拒絕PEP:http://www.python.org/dev/peps/pep-3136/ – mhlester

+0

@mhlester你是什麼意思否決PEP? – Vader

+2

有人建議**命名**循環,以便您可以跳出特定的循環。它被拒絕了。該鏈接有這樣的討論。 – mhlester

回答

37

你應該把你的循環函數裏面,然後返回:

def myfunc(): 
    for i in range(1, 1001): 
     for i2 in range(i, 1001): 
      for i3 in range(i2, 1001): 
       if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000: 
        print i*i2*i3 
        return # Exit the function (and stop all of the loops) 
myfunc() # Call the function 

使用return立即退出封閉功能。在這個過程中,所有的循環都會停止。

9

可以產生一個異常

try: 
    for a in range(5): 
     for b in range(5): 
      if a==b==3: 
       raise StopIteration 
      print b 
except StopIteration: pass 
+1

似乎有點奇怪在這種特殊情況下使用異常(並且看起來不太好),因爲代碼應該真的被放入自己的功能 - 然後「返回」將起作用。 – CoDEmanX

+0

在某些情況下,仍然需要在循環後執行一些代碼行,所以我會去嘗試除了解決方案 – lweingart

1

不知道這是否可能最乾淨的方式做到這一點,但你可以在每一個循環的頂部做一個布爾檢查。

do_loop = True 

for i in range(1, 1001): 
    if not do_loop: 
     break 
    for i2 in range(i, 1001): 
     # [Loop code here] 
     # set do_loop to False to break parent loops 
+0

我想避免添加更多的檢查和循環。目前的代碼效率很低。 – Vader

8

爲什麼不使用生成器表達式:

def my_iterator() 
    for i in range(1, 1001): 
     for i2 in range(i, 1001): 
      for i3 in range(i2, 1001): 
       yield i,i2,i3 

for i,i2,i3 in my_iterator(): 
    if i*i + i2*i2 == i3*i3 and i + i2 + i3 == 1000: 
     print i*i2*i3 
     break