提问人:ThunderEX 提问时间:12/21/2012 最后编辑:Martijn PietersThunderEX 更新时间:12/21/2012 访问量:70194
中断并继续功能
break and continue in function
问:
def funcA(i):
if i%3==0:
print "Oh! No!",
print i
break
for i in range(100):
funcA(i)
print "Pass",
print i
我知道上面的脚本不起作用。那么,如果我需要将一个带有中断或继续的函数放入循环中,我该如何编写呢?
答:
1赞
eumiro
12/21/2012
#1
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
评论
2赞
5/18/2016
您能否解释一下此代码如何回答该问题?
1赞
LtWorf
12/21/2012
#2
break 不会在函数之间传播,您需要将其直接放在循环中的某个地方。
35赞
BrenBarn
12/21/2012
#3
函数不能在调用它的代码中导致中断或继续。中断/继续必须从字面上出现在循环中。您的选项包括:
- 从 funcA 返回一个值,并使用它来决定是否中断
- 在 funcA 中引发异常,并在调用代码(或调用链上某个位置)捕获它
- 编写一个封装中断逻辑的生成器,并对其进行迭代,而不是
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
这允许您通过将它们分组到基于“基本”迭代器(在本例中为范围)的生成器中来将中断与条件放在一起。然后,你遍历这个生成器,而不是范围本身,你会得到中断行为。
评论
1赞
ThunderEX
12/21/2012
封装中断逻辑的生成器?
0赞
eumiro
12/21/2012
@ThunderEX - 类似的东西itertools.takewhile
0赞
BrenBarn
12/21/2012
@ThunderEX:是的,类似于takewhile。请参阅我编辑的答案。
3赞
Jakub M.
12/21/2012
#4
详细阐述 BrenBarns 的答案:幸运的是不会传播。 就是打破电流循环,周期。如果要传播事件,则应出现异常。虽然,引发异常来破坏循环是一种非常丑陋的破坏循环的方式,也是一种打破代码的好方法。break
break
raise
亲吻!最简单的方法是直接在循环中检查条件
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
生成器示例有其优点,它使您的代码更具功能风格(我非常喜欢)
# 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
...这类似于 Eumiro 提到的 TakeWhile
评论