Generador (informática)

rutina especial en informática

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.

PythonEditar

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

RubyEditar

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énEditar