do zbierania tylko jeden element zastosowania generatora break
w for
rachunku lub list(itertools.islice(gen, 1))
Według swoim przykładzie (litterally) można zrobić tak:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Jeśli chcesz "dostać jus t jeden element z [wcześniej wytworzone] generatora ilekroć like "(I przypuszczać 50% ów pierwotnego zamiaru i najczęściej zamiaru), a następnie:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
ten sposób wyraźnie stosowanie generator.next()
może być uniknięto, a obsługa końcówek wejściowych nie wymaga (tajemniczej) obsługi wyjątków ani dodatkowych domyślnych porównań wartości.
Sekcja instrukcji else:
z for
jest potrzebna tylko wtedy, gdy chcesz zrobić coś specjalnego w przypadku końca generatora.
Uwaga na next()
/.next()
:
W Python3 metoda .next()
został przemianowany na .__next__()
dobrego powodu: jej uznać niskopoziomowe (PEP 3114). Przed wersją Python 2.6 wbudowana funkcja next()
nie istniała. Omówiono nawet przeniesienie next()
do modułu operator
(co byłoby mądre), ze względu na rzadką potrzebę i wątpliwą inflację wbudowanych nazw.
Bez domyślnych ustawień nadal jest bardzo niskopoziomowa - rzucając tajemniczo StopIteration
jak bolt z błękitu w normalnym kodzie aplikacji. I używanie next()
z domyślnym wartownikiem - który najlepiej powinien być jedyną opcją dla next()
bezpośrednio w builtins
- jest ograniczone i często daje powód do nieparzystej logiki nie-pytonowej/odczytu.
Dolna linia: użycie next() powinno być bardzo rzadkie - podobnie jak korzystanie z funkcji modułu operator
. Korzystanie z funkcji Iterator płynnie jest naturalnym sposobem korzystania z iteratorów na poziomie aplikacji - i zawsze jest to możliwe. next()
jest niskim poziomem, dodatkową koncepcją, nieoczywistą - jak pokazuje pytanie tego wątku. Chociaż np. używanie break
w for
jest konwencjonalne.
Uwaga: spowoduje to jedynie zatrzymanie podczas próby użycia g.next() po dostarczeniu ostatniego elementu g. – Wilduck
'next (gen, default)' może być również użyte w celu uniknięcia wyjątku 'StopIteration'. Na przykład 'next (g, None)' dla generatora łańcuchów albo przyniesie łańcuch, albo None po zakończeniu iteracji. – Attila
w Pythonie 3000, następny() to __next __() –