2011-03-10 18 views

Respuesta

50

Para hacer una clase iterable, escriba un método __iter__() que devuelve un iterador. Ejemplo

class MyList(object): 
    def __init__(self): 
     self.list = [42, 3.1415, "Hello World!"] 
    def __iter__(self): 
     return iter(self.list) 

m = MyList() 
for x in m: 
    print x 

impresiones

42 
3.1415 
Hello World! 

el ejemplo se utiliza un iterador de lista, pero también se podrían escribir su propio iterador ya sea haciendo __iter__() un generator o devolviendo una instancia de una clase de iterador que define un next() método.

+2

También hay otra manera con '__getitem__', vea http://stackoverflow.com/a/9884259/284795 –

+0

@ColonelPanic tiene razón, si define' __getitem__' la clase también es iterable. Sin embargo, ignorará que también definiste '__len__' y simplemente iterará indefinidamente. – jlh

2

Este question le puede ayudar, se describe cómo realizar una interator

8

El Python documentation describe exactamente esto:

Un método necesita ser definido para objetos contenedores para proporcionar iteración de apoyo:

container.__iter__() 

Devolución y devolución ator objeto. El objeto es necesario para admitir el protocolo de iterador que se describe a continuación. Si un contenedor admite diferentes tipos de iteración, se pueden proporcionar métodos adicionales para solicitar específicamente iteradores para esos tipos de iteración. (Un ejemplo de un objeto que admite múltiples formas de iteración sería una estructura de árbol que admite tanto transversal de ancho como primero de profundidad). Este método corresponde al intervalo de tp_iter de la estructura de tipo para objetos de Python en la API de Python/C.

El iterador objetos mismos se requieren para apoyar los dos métodos siguientes, que juntos forman el protocolo iterador:

iterator.__iter__() 

Return el propio objeto iterador. Esto es necesario para permitir que los contenedores y los iteradores se utilicen con las instrucciones para y en. Este método corresponde al intervalo tp_iter de la estructura de tipo para objetos de Python en Python/C API.

iterator.next() 

Volver al siguiente elemento del contenedor. Si no hay más elementos, levante la excepción StopIteration. Este método corresponde al intervalo tp_iternext de la estructura de tipo para objetos de Python en Python/C API.

0

Querrá next() y __iter__() métodos. Here's a nice little tutorial.

+0

Ese tutorial es solo para Python 2. Para el registro, Python 3 existía cuando se publicó esta respuesta. Aquí está [uno] (http://nvie.com/posts/iterators-vs-generators/) para Python 3. –

4

Cualquier objeto con un método __iter__() se considera iterable.

Además, cualquier secuencia (objetos que tengan un método __getitem__()) podría devolver un iterador.Un iterador es un objeto con un método __next__() que devuelve el siguiente objeto en la secuencia y arroja una excepción StopIteration.

Cuestiones relacionadas