Iteratore: differenze tra le versioni

143 byte aggiunti ,  12 anni fa
nessun oggetto della modifica
Nessun oggetto della modifica
Alcuni linguaggi orientati agli oggetti, come Perl e Python, forniscono un modo intrinseco di iterare sugli elementi di un oggetto contenitore senza l'introduzione di un oggetto iteratore esplicito.
Ciò si manifesta spesso in qualche tipo di operatore "for-each", come nei seguenti esempi:
<source lang=perl>
 
# Perl, iterazione implicita
foreach $val (@list) {
print "$val\n";
}</source>
<source lang=python>
 
# Python, iterazione implicita
for Value in List:
print Value
</source>
 
Anche il linguaggio C++ ha un template di funzione std::for_each() che permette una simile iterazione implicita, ma richiede ancora oggetti iteratori espliciti come input iniziale.
 
Tutti i tipi di sequenza incorporati in Python supportano l'iterazione, così come molte classi che fanno parte della libreria standard.
Il seguente esempio mostra una tipica iterazione implicita su un sequenza:
<source lang=python>
 
for value in sequence:
print value
</source>
 
Tuttavia, gli iteratori possono essere usati e definiti esplicitamente. Per ogni tipo o classe di sequenza iterabile, la funzione incorporata iter() viene usata per creare un oggetto iteratore. Tale oggetto iteratore fornisce un metodo next() che rende l'elemento successivo del contenitore. Quando non rimangono più elementi, verrà sollevata un'eccezione di tipo StopIteration. Il seguente esempio mostra un'iterazione equivalente su una sequenza usando iteratori espliciti:
<source lang=python>
 
it = iter(sequence)
try:
except StopIteration:
pass
</source>
 
Qualunque classe definita dall'utente può supportare l'iterazione standard (sia implicita che esplicita) definendo un metodo <code>__iter__()</code> che crea un oggetto iteratore (che dovrà definire il metodo <code>next()</code>).
 
Anche Python supporta i generatori, che sono una categoria speciale di iteratori su una collezione non realizzata. Un generatore è una funzione "congelata". Dopo che ogni valore è stato emesso (con l'istruzione "yield"), lo stato della funzione viene congelato. Quando la funzione viene invocata nuovamente, l'esecuzione riprende dal punto in cui l'istruzione 'yield' l'aveva abbandonata, con tutte le variabili della funzione nello stato in cui erano. Ecco un esempio di un generatore che rende ogni numero della successione di Fibonacci:
<source lang=python>
 
def fibo_gen():
x = 0
yield x
x, y = y, x+y
</source>
 
== Collegamenti esterni ==
* [http://boost.org/libs/iterator/doc/index.html Boost C++ Iterator Library]
136

contributi