Generador (informática)

De Wikipedia, la enciclopedia libre

En programación, un generador es una rutina especial que se puede usar para controlar el comportamiento de un iterador en un bucle. Un generador es muy similar a una función que devuelve un vector, en el que un generador tiene los parámetros que se pueden llamar, y genera una secuencia de valores.

La manera más simple de conseguir una secuencia de datos es declarando un array o vector declarando manualmente cada valor. Esta práctica puede volverse tediosa y consumir mucho tiempo al desarrollador si el array o vector requiere que existan una gran cantidad de elementos dentro de él. En ese caso un generador resulta ser una manera más rápida de declarar el array o vector.

Otra gran ventaja de los generadores radica en que consume una menor cantidad de recursos en memoria, por lo tanto, permite que quien lo llama comience a procesar los primeros valores inmediatamente. En resumen, un generador se asemeja a una función pero se comporta como un iterador.

Los generadores pueden implementarse en construcciones de control de flujo más expresivas, como la continuación de objetos de primera clase o como co-funciones.

Los generadores aparecen por primera vez en 1975 en el lenguaje CLU; y están disponibles en Python, C#, JavaScript, [Ruby] y en otros idiomas. En CLU y C#, los generadores se llaman iteradores y en Ruby enumeradores.

Python[editar]

Un ejemplo de generador en Python:

def countfrom(n):
    while True:
        yield n
        n += 1

# Ejemplo: mostrar los enteros entre 10 y 20.
# Hay que tener en cuenta que esta iteración normalmente termina,
# aunque el countfrom() se escriba como un bucle infinito.

for i in countfrom(10):
    if i <= 20:
        print(i)
    else:
        break

# Otro generador, que produce los primeros números primos
# a "to" si a> = 2, de lo contrario indefinidamente dependiendo de la necesidad.

def primos (to):
    yield 2 # primer número primero, y único par
    n = 3
    p = []
    while n <= to or to < 2:
        sqr_n = int(n**0.5)
        if not any(n%f == 0 for f in p if f <= sqr_n): # funciona desde Python 2.5  con el paquete NumPy que introduce any()
            yield n
            p.append(n)
        n += 2  # Sólo revisar impares
    raise StopIteration

Ruby[editar]

Ruby soporta generadores (a partir de la versión 1.9) en la clase Enumerator.

# Generador de un objeto enumerable
chars = Enumerator.new(['A', 'B', 'C', 'Z'])

4.times { puts chars.next }

# Generatore de un bloque
count = Enumerator.new do|yielder|
  i=0
  loop{ yielder.yield i += 1}
end

100.times { puts count.next }

Véase también[editar]