Z tego co rozumiem, o for x in a_generator: foo(x)
pętli w Pythonie jest grubsza odpowiada to:Czy pętla przechodzi przez generator w pętli przez ten sam generator bezpieczny w Pythonie?
try:
while True:
foo(next(a_generator))
except StopIteration:
pass
To sugeruje, że coś takiego:
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)
byłoby zrobić dwie rzeczy:
- Nie wywołuj żadnych wyjątków, awarii ani niczego w tym rodzaju.
- Powtórz powyższe czynności, dopóki nie osiągnie jakiegoś
x
, gdzieshould_inner_loop(x)
wraca do prawdy, a następnie przełącza się na nią wewnętrznymfor
, aż do momentu, gdystop_inner_loop(thing)
zwróci wartość true. Następnie zewnętrzna pętla odzywa się , gdzie wewnętrzna pozostała wyłączona:.
Z moich, wprawdzie niezbyt dobrych testów, wynika, że działa jak powyżej. Jednak nie znalazłem niczego w specyfikacji gwarantującej, że takie zachowanie jest stałe u tłumaczy. Czy jest coś, co mówi lub sugeruje, że mogę być pewien, że zawsze tak będzie? Czy może powodować błędy lub wykonywać je w inny sposób? (Czyli zrobić coś innego niż to, co opisano powyżej
NB Odpowiednik kodu powyżej pochodzi z własnego doświadczenia, nie wiem, czy to rzeczywiście dokładne Dlatego pytam
Nawet jeśli twoja logika brzmi w odniesieniu do tego, które elementy są zużywane i kiedy, będzie to trudne dla kogoś innego (łącznie z twoim przyszłym "ja"), aby połączyć to, co się dzieje. –
@JaredGoguen Zgadzam się. W moim prawdziwym kodzie, mam wewnętrzną pętlę wyodrębnioną do innej metody, ale myślałem, że intencja pytania byłaby jaśniejsza, gdybym nie miała innej metody. –