Da quello che ho capito, un ciclo for x in a_generator: foo(x)
in Python è grosso modo equivalente a questo:È in loop un generatore in loop su quello stesso generatore sicuro in Python?
try:
while True:
foo(next(a_generator))
except StopIteration:
pass
Questo suggerisce che qualcosa di simile:
for outer_item in a_generator:
if should_inner_loop(outer_item):
for inner_item in a_generator:
foo(inner_item)
if stop_inner_loop(inner_item): break
else:
bar(outer_item)
sarebbe fare due cose:
- Non sollevare eccezioni, segfault o qualcosa del genere
- Iterate over
y
fino a raggiungere lox
doveshould_inner_loop(x)
restituisce la verità, quindi eseguire il ciclo su di esso nel numero internofor
fino astop_inner_loop(thing)
restituisce true. Quindi, il ciclo esterno riprende dove quello interno è stato interrotto.
Dai miei test dichiaratamente non molto buoni, sembra funzionare come sopra. Tuttavia, non sono riuscito a trovare nulla nelle specifiche a garanzia che questo comportamento sia costante tra gli interpreti. C'è qualcosa che dice o implica che posso essere sicuro che sarà sempre così? Può causare errori o funzionare in qualche altro modo? (Vale a dire fare qualcosa di diverso da ciò che è descritto sopra
NB Il codice equivalente di cui sopra è tratto dalla mia esperienza personale, non so se in realtà è preciso È per questo che sto chiedendo
Anche se la tua logica è valida per quanto riguarda gli elementi che vengono consumati e quando, sarà difficile per qualcun altro (incluso il tuo sé futuro) ricostruire insieme cosa sta succedendo. –
@ JaredGoguen Sono d'accordo. Nel mio codice attuale, ho il ciclo interno estratto in un altro metodo, ma ho pensato che l'intento della domanda sarebbe stato più chiaro se non avessi un altro metodo. –