Determinando o vazio de um gerador
Em Python, os geradores são uma ferramenta poderosa para avaliação preguiçosa e iteração em grandes conjuntos de dados. Contudo, determinar se um gerador está vazio apresenta um desafio único devido à sua natureza dinâmica. Ao contrário das listas ou tuplas, os geradores não têm um atributo de tamanho e simplesmente iterá-los resultaria em uma exceção StopIteration.
Peek vs. HasNext
Alguns podem sugerir usando a função peek() para verificar se um gerador possui itens. Embora peek() permita recuperar o primeiro item de um gerador sem consumi-lo, ele não fornece uma maneira de determinar se o gerador está vazio. Isso ocorre porque peek() gera uma exceção StopIteration quando o gerador está vazio, o que é indistinguível da exceção que seria gerada ao tentar iterar sobre um gerador vazio.
Da mesma forma, a função hasNext(), comumente encontrado em Java, não está disponível em geradores Python.
Verificando o vazio desde o início
Para determinar se um gerador está vazio desde o início, você pode usar um função personalizada como a fornecida na resposta:
def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
Esta função recupera o primeiro elemento do gerador, retornando None se o gerador estiver vazio. Ele também preserva o estado do gerador retornando uma versão modificada que inclui o primeiro elemento.
Uso
Para usar esta função, você pode chamá-la com o gerador como um argumento:
res = peek(mysequence)
if res is None:
# sequence is empty. Do stuff.
else:
first, mysequence = res
# Do something with first, maybe?
# Then iterate over the sequence:
for element in mysequence:
# etc.
Esta verificação permite determinar se o gerador está vazio e tratar o caso vazio adequadamente, antes de iterá-lo.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3