Para escolher apenas um elemento de um gerador, use break
em uma for
declaração oulist(itertools.islice(gen, 1))
De acordo com o seu exemplo (literalmente), você pode fazer algo como:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Se você deseja " obter apenas um elemento do gerador [uma vez gerado] sempre que eu quiser " (suponho que 50% seja a intenção original e a intenção mais comum), então:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
Dessa maneira, o uso explícito de generator.next()
pode ser evitado e o tratamento de final de entrada não requer StopIteration
tratamento de exceção (enigmático) ou comparações extras de valores padrão.
A seção else:
de for
declaração é necessária apenas se você quiser fazer algo especial no caso de fim de gerador.
Nota sobre next()
/ .next()
:
No Python3, o .next()
método foi renomeado .__next__()
por um bom motivo: é considerado de baixo nível (PEP 3114). Antes do Python 2.6, a função interna next()
não existia. E foi discutido até a mudança next()
para o operator
módulo (o que seria sensato), devido à sua rara necessidade e inflação questionável de nomes internos.
Usar next()
sem padrão ainda é uma prática de nível muito baixo - lançar o enigmático StopIteration
como um raio do nada no código normal do aplicativo abertamente. E o uso next()
com o sentinel padrão - que melhor deve ser a única opção para uma entrada next()
direta builtins
- é limitado e geralmente dá motivo a lógicas / legibilidade não-pitonais estranhas.
Conclusão: Usar next () deve ser muito raro - como usar funções do operator
módulo. Usando for x in iterator
, islice
, list(iterator)
e outras funções aceitar um iterador perfeitamente é a maneira natural de usar iteradores no nível de aplicação - e bastante sempre possível. next()
é de baixo nível, um conceito extra, não óbvio - como mostra a pergunta deste tópico. Enquanto, por exemplo, o uso break
em for
é convencional.