15 maggio 2010

PYTHON generators and iterators

Fondamentalmente gli iteratori sono degli oggetti della funzione iter(X), che definiscono il metodo __next__(), restituendo un elemento successivo fino a che non ci sono più elementi da iterare, e termina con l' eccezzione StopIteration.


>>> def soldato(spara=1): #crea una funzione con un argomento
... while True: #finchè il ciclo e vero
... yield spara*spara #yield restituisce un valore expression da usarsi su una sola riga
... spara += 1 #spara = spara + 1
...
>>> pallottole = soldato(5) #assegna le pallottole al soldato
>>> pallottole #in assenza delle parentesi mostra che pallottole è un oggetto generators

>>> pallottole.next()
25
>>> pallottole.next()
36
>>> pallottole.next()
49
>>> pallottole.next()
64
>>> pallottole.next()
81
>>> pallottole.next()
100
>>> nuove_pallottole = soldato(10) #assegnamento nuove pallottole
>>> nuove_pallottole.next()
100
>>> nuove_pallottole.next()
121
>>> nuove_pallottole.next()
196
>>> spara_tutte_le_pallottole = [pallottole.next(), nuove_pallottole.next()] #lista di pallottole
>>> spara_tutte_le_pallottole #esplode tutte le pallottole
[144, 225]
>>>

un esempio che rende molto più chiaro il modo di lavorare gli iteratori

>>> import os #importo il modulo os per aprire il file dal suo path
>>> file = open(r'C:\test\spari_a_vuoto.txt') #apro il file
>>> file.next()
'primo sparo\n'
>>> file.next()
'secondo sparo\n'
>>> file.next()
'terzo sparo\n'
>>> file.next()
'quarto sparo\n'
>>> file.next()
'quinto sparo\n'
>>> file.next()
'sesto sparo\n'
>>> file.next()
'settimo sparo\n'
>>> file.next()
'ottavo sparo\n'
>>> file.next()
'nono sparo\n'
>>> file.next()
'decimo sparo\n'
>>> file.next() #tanto per ricordarvi che quando non ci sono più elementi..
'inceppatura..'
>>> file.next() #arriva l'eccezzione StopIteration!
Traceback (most recent call last):
File "", line 1, in
StopIteration
>>>

per approfondire non resta che leggere la ralativa documentazione.

Nessun commento: