Determinación del vacío de un generador
En Python, los generadores son una herramienta poderosa para la evaluación diferida y la iteración sobre grandes conjuntos de datos. Sin embargo, determinar si un generador está vacío presenta un desafío único debido a su naturaleza dinámica. A diferencia de las listas o tuplas, los generadores no tienen un atributo de tamaño y simplemente iterar sobre ellos daría como resultado una excepción StopIteration.
Peek vs. HasNext
Algunos pueden sugerir usando la función peek() para verificar si un generador tiene elementos. Si bien peek() le permite recuperar el primer elemento de un generador sin consumirlo, no proporciona una forma de determinar si el generador está vacío. Esto se debe a que peek() genera una excepción StopIteration cuando el generador está vacío, lo cual es indistinguible de la excepción que se generaría al intentar iterar sobre un generador vacío.
De manera similar, la función hasNext(), comúnmente que se encuentra en Java, no está disponible en los generadores de Python.
Comprobación del vacío desde el principio
Para determinar si un generador está vacío desde el principio, puede utilizar un función personalizada como la proporcionada en la respuesta:
def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
Esta función recupera el primer elemento del generador y devuelve Ninguno si el generador está vacío. También preserva el estado del generador devolviendo una versión modificada que incluye el primer elemento.
Uso
Para usar esta función, puedes llamarla con el generador como 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 verificación le permite determinar si el generador está vacío y manejar el caso vacío de manera adecuada, antes de iterar sobre él.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3