Для вибору лише одного елемента генератора використовуйте break
у for
операторі, абоlist(itertools.islice(gen, 1))
За вашим прикладом (буквально) ви можете зробити щось на кшталт:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Якщо ви хочете " отримати лише один елемент з [колись створеного] генератора, коли мені це подобається " (я вважаю, що 50% - це початковий намір і найпоширеніший намір), тоді:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
Цим способом generator.next()
можна уникнути явного використання , а обробка в кінці вводу не вимагає (критичного) StopIteration
оброблення виключень або додаткових порівнянь за замовчуванням.
else:
З for
розділу заяви необхідно тільки , якщо ви хочете зробити що - щось особливе в разі відслужили генератора.
Примітка про next()
/ .next()
:
У Python3 .next()
метод було перейменовано з .__next__()
поважної причини: його вважали низьким рівнем (PEP 3114). До Python 2.6 вбудованої функції next()
не існувало. І навіть обговорювалося перехід next()
до operator
модуля (що було б розумно) через рідкісну потребу та сумнівну інфляцію побудованих назв.
Використання next()
без замовчування все ще є дуже низьким рівнем практики - відкрито викидати криптовалюту StopIteration
як болт у звичайний код програми. А використання next()
дозорного режиму за замовчуванням - що найкраще має бути єдиним варіантом для next()
безпосередньо в builtins
- обмежене і часто дає підстави для непарної непітонічної логіки / читабельності.
Підсумок: Використання next () має бути дуже рідкісним - як використання функцій operator
модуля. Використовуючи for x in iterator
, islice
, list(iterator)
та інші функції , приймаючи итератор легко природний спосіб використання ітераторів на рівні додатків - і цілком можливо завжди. next()
є низькорівневим, додатковою концепцією, непомітною - як показує питання цієї теми. Хоча, наприклад, використання break
в for
звичайному.