Para escolher apenas um elemento de um gerador, use breakem uma fordeclaraçã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 StopIterationtratamento de exceção (enigmático) ou comparações extras de valores padrão.
A seção else:de fordeclaraçã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 operatormó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 StopIterationcomo 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 operatormó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 breakem foré convencional.