Generatore (informatica)

routine usata per il controllo del comportamento di un'iterazione in un loop

In informatica, un generatore è una speciale routine che può essere usata per il controllo del comportamento di un'iterazione in un ciclo. Un generatore è molto simile a una funzione che restituisce un vettore, nel quale un generatore ha i parametri, che possono essere chiamati, e genera una sequenza di valori.

Invece di costruire un vettore contenente tutti i valori e restituirli in una volta, un generatore fornisce i valori uno alla volta, il che richiede meno memoria e permette così al chiamante di iniziare a elaborare i primi valori immediatamente. In breve, un generatore assomiglia a una funzione ma si comporta come un iteratore.

I generatori possono essere implementati in costrutti di controllo di flusso più espressivi, come continuazione di oggetti di prima classe (first class object) o come co-funzioni.

I generatori appaiono per la prima volta nel 1975 nel CLU; ora sono disponibili in Python, C#, JavaScript, Ruby e altri linguaggi. In CLU e C#, i generatori vengono chiamati iteratori e in Ruby enumeratori.

Un esempio di generatore in Python:

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

# Esempio: stampare degli interi tra 10 e 20.
# Notare che questa iterazione termina normalmente, 
#malgrado il countfrom() sia scritto come un loop infinito.

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

# Un altro generatore, che produce i primi numeri primi 
#fino a "to" se to>=2, altrimenti indefinitamente a seconda del bisogno.

def primes(to):
    yield 2  # 1° numero primo, ed unico ad essere pari
    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): # funziona in Python 2.5+ o con il pacchetto NumPy che introduce any()
            yield n
            p.append(n)
        n += 2  # Esamino solo i numeri dispari
    raise StopIteration

Ruby supporta i generatori (a partire dalla versione 1.9) sotto forma di classe Enumerator.

# Generatore da un oggetto enumerabile
chars = Enumerator.new(['A', 'B', 'C', 'Z'])

4.times { puts chars.next }

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

100.times { puts count.next }

Voci correlate

modifica

Collegamenti esterni

modifica
Controllo di autoritàLCCN (ENsh85053846 · GND (DE4129040-9 · BNF (FRcb122247630 (data) · J9U (ENHE987007562694505171
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica