def funcA(i):
if i%3==0:
print "Oh! No!",
print i
break
for i in range(100):
funcA(i)
print "Pass",
print i
我知道上面的腳本將無法正常工作。那麼,如果我需要使用break或者繼續進入循環,我該怎麼寫呢?休息和繼續功能
def funcA(i):
if i%3==0:
print "Oh! No!",
print i
break
for i in range(100):
funcA(i)
print "Pass",
print i
我知道上面的腳本將無法正常工作。那麼,如果我需要使用break或者繼續進入循環,我該怎麼寫呢?休息和繼續功能
函數不能在調用它的代碼中導致中斷或繼續。 break/continue必須在循環內逐字顯示。您的選項是:
range
通過#3我的意思是這樣的:
def gen(base):
for item in base:
if item%3 == 0:
break
yield i
for i in gen(range(1, 100)):
print "Pass," i
這使您可以通過將基於「基本」迭代器(在本例中爲範圍)中的生成器組合到生成器中來將該中斷與條件放在一起。然後你遍歷這個生成器,而不是在範圍本身,你會得到破壞行爲。
def funcA(i):
if i%3==0:
print "Oh! No!",
print i
return True
else:
return False
for i in range(100):
if funcA(i):
break
print "Pass",
print i
你可以添加這個代碼是如何回答這個問題的解釋中提到? –
中斷不會在函數間傳播,你需要把它直接放在循環的某個地方。
詳細描述BrenBarns回答:break
幸運的是不會傳播。 break
是打破目前的循環,時期。如果你想傳播一個事件,那麼你應該raise
一個例外。雖然,提出異常來打破循環是一個非常難看的方式來打破循環和破壞代碼的好方法。
KISS!最簡單的將是直接檢查條件的循環
def my_condition(x):
return x == 4
for i in xrange(100):
if my_condition(i): break
print i
如果由於某種原因,你想傳播一個例外,那麼你使用這樣
# exception example
for i in xrange(100):
if i == 4: raise Exception("Die!")
print i
如前所述,它是一個真的很難看設計。想象一下,你忘了捕獲這個異常,或者你從Exception
其類型更改爲MyBreakException
,卻忘了在代碼try/except
較高的部分地方改變它...
發電機例如有其優點,它使你的代碼更functional style (我presonally崇拜)
# generator example
def conditional_generator(n, condition):
for i in xrange(n):
if condition(i):
break
else:
yield i
for i in conditional_generator(100, my_condition):
print i
...這是類似takewhile
,由eumiro
一個封裝break邏輯的生成器? – ThunderEX
@ThunderEX - 類似於'itertools.takewhile'可能 – eumiro
@ThunderEX:是的,類似於需要。看到我編輯的答案。 – BrenBarn