Détermination du vide d'un générateur
En Python, les générateurs sont un outil puissant pour l'évaluation paresseuse et l'itération sur de grands ensembles de données. Cependant, déterminer si un générateur est vide présente un défi unique en raison de sa nature dynamique. Contrairement aux listes ou aux tuples, les générateurs n'ont pas d'attribut de taille, et le simple fait de les parcourir entraînerait une exception StopIteration.
Peek vs. HasNext
Certains peuvent suggérer en utilisant la fonction peek() pour vérifier si un générateur contient des éléments. Bien que peek() permette de récupérer le premier élément d'un générateur sans le consommer, il ne permet pas de déterminer si le générateur est vide. En effet, peek() déclenche une exception StopIteration lorsque le générateur est vide, ce qui est impossible à distinguer de l'exception qui serait déclenchée lors d'une tentative d'itération sur un générateur vide.
De même, la fonction hasNext(), généralement trouvé en Java, n'est pas disponible dans les générateurs Python.
Vérification du vide dès le début
Pour déterminer si un générateur est vide dès le début, vous pouvez utiliser un fonction personnalisée comme celle fournie dans la réponse :
def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
Cette fonction récupère le premier élément du générateur, renvoyant None si le générateur est vide. Il préserve également l'état du générateur en renvoyant une version modifiée qui inclut le premier élément.
Utilisation
Pour utiliser cette fonction, vous pouvez l'appeler avec le générateur en tant que argument :
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.
Cette vérification vous permet de déterminer si le générateur est vide et de gérer le cas vide de manière appropriée, avant de le parcourir.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3