alcune cose circa il vostro codice:
__iter
dovrebbero essere __iter__
- Stai tornando '33' nel Funzione
__iter__
.Si dovrebbe effettivamente restituire un oggetto iteratore . Un iteratore è un oggetto che continua a restituire valori diversi quando si chiama la funzione next()
(forse una sequenza di valori come [0,1,2,3 ecc.]).
Ecco un esempio di lavoro di un iteratore:
class a(object):
def __init__(self,x=10):
self.x = x
def __iter__(self):
return self
def next(self):
if self.x > 0:
self.x-=1
return self.x
else:
raise StopIteration
c=a()
for x in c:
print x
Ogni oggetto della classe a
è un oggetto iteratore. Chiamando la funzione __iter__
si suppone che restituisca l'iteratore, quindi restituisce stesso - come si può vedere, la classe ha una funzione next()
, quindi questo è un oggetto iteratore.
Quando la funzione successivo è chiamato, esso mantiene restituire valori consecutivi finché non raggiunge lo zero, e quindi invia l'eccezione StopIteration
, che (opportunamente) arresta l'iterazione.
Se questo vi sembra un po 'confuso, vorrei suggerire a sperimentare con il codice e poi controllando la documentazione qui: http://docs.python.org/library/stdtypes.html
fonte
2009-12-24 04:22:24
Ma se sta solo tornando (cedendo) 33, è davvero un * iteratore *? –
Bene, se ** si produce ** 33, allora sì, allora il metodo diventa un'espressione generatore, che produce un iteratore. Quando ritorni [33], beh, un elenco è certamente iterabile, quindi funziona anche. – shylent
@Goose e @Shylent, yep: 'yield 33' rende' __iter__' una funzione di generatore (** not ** generator _expression_ - che è un costrutto diverso ;-), quindi restituisce un generatore, che è un iteratore; 'return [33]' restituisce un iteratore iterabile ma non un iteratore, quindi è leggermente imperfetto - modifica la risposta per correggere quel cavillo! -) –