Generatore (informatica)
In informatica, un generatore è una speciale routine che può essere usata per il controllo del comportamento di un'iterazione in un loop. 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 vengnono chiamati iteratori e in Ruby enumeratori.
Python [modifica]
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 indefinitamente a seconda del bisogno. def primes(): n = 2 p = [] while True: if not any(n % f == 0 for f in p): # funziona in Python 2.5+ o con il pacchetto NumPy che introduce any() yield n p.append(n) n += 1
Ruby [modifica]
Ruby supporta i generatori (a partire dalla versione 1.9) sotto forma di classe Enumeratore.
# 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]
|
|