Método iterador: patrones de diseño de Python

El método iterador es un patrón de diseño de comportamiento que nos permite recorrer los elementos de las colecciones sin exponer los detalles profundos de los elementos. Proporciona una forma de acceder secuencialmente a los elementos de una estructura de datos compleja sin repetirlos.
Según GangOfFour , Iterator Pattern se utiliza «para acceder a los elementos de un objeto agregado secuencialmente sin exponer su implementación subyacente» .
 

El siguiente diagrama muestra la estructura de datos de la lista enlazada. 
 

Iterator-Method-Linked-List

Iterator-method-Linked-List

Problema sin usar el método iterador

Imagine que está creando una aplicación para niños pequeños que toma cualquier alfabeto válido como entrada y devuelve todos los alfabetos hasta ese. Cuando esta aplicación se usará solo unas pocas veces, está bien ejecutar For loop y While loop una y otra vez, pero cuando la frecuencia de ejecución aumenta, este proceso se vuelve bastante ineficiente. Entonces, tenemos que encontrar una manera de evitar estos bucles. Este problema puede volverse más grande cuando trabajemos en estructuras de datos no lineales complejas como árboles, gráficos donde atravesar no es tan simple como en una array. 
El siguiente diagrama muestra la imagen de la estructura de datos del árbol.
 

Iterator-Method-Tree-Data-Structure

Iterador-método-árbol-datos-estructura

Solución usando el método iterador

Aquí discutiremos la solución para el problema descrito anteriormente. Siempre es útil para los usuarios de Python usar iteradores para atravesar cualquier tipo de estructura de datos, sin importar si son estructuras de datos lineales o no lineales. Tenemos dos opciones para implementar iteradores en Python: podemos usar los iteradores incorporados para producir un resultado fructífero o explícitamente podemos crear iteradores con la ayuda de Generators . En el siguiente código, hemos creado explícitamente los iteradores con la ayuda de generadores.
 

Nota: El siguiente código es el ejemplo de un método Iterator creado explícitamente
 

Python3

""" helper method for iterator"""
 
 
def alphabets_upto(letter):
    """Counts by word numbers, up to a maximum of five"""
    for i in range(65, ord(letter)+1):
            yield chr(i)
 
 
"""main method"""
if __name__ == "__main__":
 
    alphabets_upto_K = alphabets_upto('K')
    alphabets_upto_M = alphabets_upto('M')
 
    for alpha in alphabets_upto_K:
        print(alpha, end=" ")
 
    print()
 
    for alpha in alphabets_upto_M:
        print(alpha, end=" ")

Nota: El siguiente código es el ejemplo del uso de un método iterador incorporado
 

Python3

"""utility function"""
def inBuilt_Iterator1():
     
    alphabets = [chr(i) for i in range(65, 91)]
     
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
 
"""utility function"""
def inBuilt_Iterator2():
     
    alphabets = [chr(i) for i in range(97, 123)]
     
    """using in-built iterator"""
    for alpha in alphabets:
        print(alpha, end = " ")
    print()
 
 
"""main method"""
if __name__ == "__main__" :
     
    """call the inbuiltIterators"""
    inBuilt_Iterator1()
    inBuilt_Iterator2()

Diagrama de clase

A continuación se muestra el diagrama de clases para el método Iterator. 
 

Iterator-Method-Class-Diagram

Iterator-Method-Class-Diagram

ventajas

  • Principio de responsabilidad única: es realmente fácil extraer los grandes algoritmos en clases separadas en el método Iterator.
  • Principio abierto/cerrado: pasar los nuevos iteradores y colecciones al código del cliente no rompe el código que se puede instalar fácilmente en él.
  • Interfaz fácil de usar: hace que la interfaz sea realmente fácil de usar y también admite las variaciones en el recorrido de las colecciones.

Desventajas

  • Desperdicio innecesario de recursos: no siempre es un buen hábito usar el método Iterator porque a veces puede resultar una exageración de recursos en una aplicación simple donde no se requieren cosas complejas.
  • Aumenta la complejidad: como dijimos anteriormente, el uso del método Iterator hace que las aplicaciones simples sean complejas.
  • Disminuye la eficiencia: acceder a los elementos directamente es una opción mucho mejor en comparación con acceder a los elementos mediante el iterador en términos de eficiencia.

Aplicabilidad
 

  • Exposición limitada: cuando desea acceder a los elementos en el nivel inferior, es decir, no está interesado en la implementación interna de los elementos, entonces siempre es preferible utilizar el método Iterator.
  • Atravesar estructuras de datos desconocidas: el método del iterador se puede usar fácilmente para atravesar varios tipos de estructuras de datos, como árboles, gráficos, pilas, colas, etc., ya que el código proporciona un par de interfaces genéricas tanto para colecciones como para iteradores.

Lectura adicional: método de iterador en Java
 

Publicación traducida automáticamente

Artículo escrito por chaudhary_19 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *