Opracowanie BrenBarns odpowiedź: break
na szczęście nie będzie propagować. break
jest przerwanie bieżącej pętli, kropka. Jeśli chcesz propagować zdarzenie, to powinieneś uzyskać wyjątek od raise
. Chociaż podniesienie wyjątku w celu przerwania pętli to naprawdę paskudny sposób na przerwanie pętli i dobry sposób na złamanie kodu.
KISS! Najprostszym byłoby sprawdzić stan bezpośrednio w pętli
def my_condition(x):
return x == 4
for i in xrange(100):
if my_condition(i): break
print i
Jeśli z jakiegoś powodu chcesz propagować wyjątek, a następnie go używać jak to
# exception example
for i in xrange(100):
if i == 4: raise Exception("Die!")
print i
Jak wspomniano, jest naprawdę brzydki projekt. Wyobraź sobie zapomnieć złapać ten wyjątek, lub zmienić jego typ z Exception
do MyBreakException
i zapomnij zmienić go gdzieś w try/except
wyższej części kodu ...
Przykładowy generator ma swoje zalety, to sprawia, że Twój kod bardziej functional style (co presonally adorować)
# 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
... który jest podobny do takewhile
, wspomniane przez eumiro
generator, który hermetyzuje logikę przerwań? – ThunderEX
@ThunderEX - coś takiego jak 'itertools.takewhile' prawdopodobnie – eumiro
@ThunderEX: Tak, podobne do takewhile. Zobacz moją zredagowaną odpowiedź. – BrenBarn