Do wybrania tylko jednego elementu generatora użyj break
w for
instrukcji lublist(itertools.islice(gen, 1))
Zgodnie z twoim przykładem (dosłownie) możesz zrobić coś takiego:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Jeśli chcesz „ dostać tylko jeden element z generatora [raz wygenerowanego] , kiedy tylko chcę ” (przypuszczam, że 50% to pierwotna intencja i najczęstsza intencja):
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
W ten sposób generator.next()
można uniknąć jawnego użycia , a obsługa końca wejścia nie wymaga (tajemniczej) StopIteration
obsługi wyjątków lub dodatkowych porównań wartości domyślnych.
else:
Z for
sekcji oświadczenie jest potrzebne tylko wtedy, gdy chcesz zrobić coś specjalnego w przypadku wycofanych z generatora.
Uwaga na next()
/ .next()
:
W Python3 .next()
zmieniono nazwę tej metody .__next__()
na dobry powód: uważany za niski poziom (PEP 3114). Przed Pythonem 2.6 wbudowana funkcja next()
nie istniała. Dyskutowano nawet o przejściu next()
do operator
modułu (co byłoby mądre) ze względu na jego rzadką potrzebę i wątpliwą inflację wbudowanych nazw.
Używanie next()
bez domyślnych ustawień jest nadal bardzo niskim poziomem praktyki - rzucanie zagadkami StopIteration
jak grom z jasnego nieba w normalnym kodzie aplikacji otwarcie. Korzystanie next()
z domyślnego wartownika - który najlepiej powinien być jedyną opcją dla next()
bezpośredniego builtins
wejścia - jest ograniczone i często daje powód dziwnej nie pytonicznej logiki / zdolności odczytu.
Konkluzja: Używanie next () powinno być bardzo rzadkie - podobnie jak korzystanie z funkcji operator
modułu. Korzystanie for x in iterator
, islice
, list(iterator)
oraz inne funkcje przyjmowania iterator bezproblemowo jest naturalnym sposobem korzystania iteratory na poziomie aplikacji - i dość zawsze możliwe. next()
jest niski poziom, dodatkowa koncepcja, nieoczywista - jak pokazuje pytanie tego wątku. Podczas gdy np. Używanie break
w for
jest konwencjonalne.