Generador (informática)

De Wikipedia, la enciclopedia libre
Ir a la navegación Ir a la búsqueda

En computació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.

En lugar de construir un vector que contenga todos los valores y devolverlos de una vez, un generador proporciona un valor a la vez, lo que requiere menos memoria y, 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]