Istnieje kilka sposobów, aby wydostać się z kilku zagnieżdżonych pętliWysyłanie StopIteration do pętli spoza iterator
one:
1) używać włamanie kontynuować
for x in xrange(10):
for y in xrange(10):
print x*y
if x*y > 50:
break
else:
continue # only executed if break was not used
break
2) do stosowania powrót
def foo():
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
return
foo()
3) użycie specjalnego wyjątku
class BreakIt(Exception): pass
try:
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
raise BreakIt
except BreakIt:
pass
Myślałem, że może być jakiś inny sposób na zrobienie tego. Używa wyjątku StopIteration wysyłanego bezpośrednio do zewnętrznej pętli. Napisałem ten kod
it = iter(range(10))
for i in it:
for j in range(10):
if i*j == 20:
raise StopIteration
Niestety StopIteration nie zostały zaczepione przez pętli for a kod produkowane brzydki Traceback. Myślę, że to dlatego, że StopIteracja nie została wysłana z wnętrza iteratora it. (to jest moje przypuszczenie, nie jestem tego pewien).
Czy istnieje sposób, w jaki mogę wysłać StopIteration do zewnętrznej pętli?
Dzięki!
Proszę, czy możesz wyjaśnić, jak działa soppable_iter? Nie rozumiem tej części zaczynającej się od x: ... – ovgolovin
To jest naprawdę sprytne i znacznie krótsze niż wersja klasowa, którą dostarczyłem! – kindall
Myślę, że muszę bliżej przyjrzeć się coroutines, ponieważ z moją obecną wiedzą o tym nie mogę pojąć, co robi algorytm w stoppable_iter. – ovgolovin