Do wybrania tylko jednego elementu generatora użyj breakw forinstrukcji 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) StopIterationobsługi wyjątków lub dodatkowych porównań wartości domyślnych.
else:Z forsekcji 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 operatormoduł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 StopIterationjak 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 builtinswejś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 operatormoduł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 breakw forjest konwencjonalne.