Generadores en Python

Requisitos previos: palabra clave de rendimiento e iteradores

Hay dos términos involucrados cuando hablamos de generadores.

  1. Función de generador: una función de generador se define como una función normal, pero cada vez que necesita generar un valor, lo hace con la palabra clave yield en lugar de return. Si el cuerpo de una definición contiene rendimiento, la función se convierte automáticamente en una función generadora.

    # A generator function that yields 1 for first time,
    # 2 second time and 3 third time
    def simpleGeneratorFun():
        yield 1            
        yield 2            
        yield 3            
       
    # Driver code to check above generator function
    for value in simpleGeneratorFun(): 
        print(value)

    Producción :

    1
    2
    3
  2. Generator-Object: las funciones de generador devuelven un objeto generador. Los objetos generadores se usan llamando al siguiente método en el objeto generador o usando el objeto generador en un bucle «for in» (como se muestra en el programa anterior).

    # A Python program to demonstrate use of 
    # generator object with next() 
      
    # A generator function
    def simpleGeneratorFun():
        yield 1
        yield 2
        yield 3
       
    # x is a generator object
    x = simpleGeneratorFun()
      
    # Iterating over the generator object using next
    print(x.next()) # In Python 3, __next__()
    print(x.next())
    print(x.next())

    Producción :

    1
    2
    3

Entonces, una función generadora devuelve un objeto generador que es iterable, es decir, puede usarse como iteradores .

Como otro ejemplo, a continuación se muestra un generador de números de Fibonacci.

# A simple generator for Fibonacci Numbers
def fib(limit):
      
    # Initialize first two Fibonacci Numbers 
    a, b = 0, 1
  
    # One by one yield next Fibonacci Number
    while a < limit:
        yield a
        a, b = b, a + b
  
# Create a generator object
x = fib(5)
  
# Iterating over the generator object using next
print(x.next()) # In Python 3, __next__()
print(x.next())
print(x.next())
print(x.next())
print(x.next())
  
# Iterating over the generator object using for
# in loop.
print("\nUsing for in loop")
for i in fib(5): 
    print(i)

Producción :

0
1
1
2
3

Using for in loop
0
1
1
2
3

Aplicaciones: supongamos que vamos a crear un flujo de números de Fibonacci, adoptar el enfoque del generador lo hace trivial; solo tenemos que llamar a next(x) para obtener el siguiente número de Fibonacci sin preocuparnos de dónde o cuándo termina el flujo de números.
Un tipo más práctico de procesamiento de flujo es el manejo de archivos de datos de gran tamaño, como archivos de registro. Los generadores proporcionan un método que ahorra espacio para dicho procesamiento de datos, ya que solo se manejan partes del archivo en un momento determinado. También podemos usar iteradores para estos propósitos, pero Generator proporciona una forma rápida (no necesitamos escribir los métodos __next__ y __iter__ aquí).

Consulte el enlace a continuación para obtener aplicaciones más avanzadas de generadores en Python.
http://www.dabeaz.com/finalgenerator/

Este artículo es una contribución de Shwetanshu Rohatgi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *