iter example __iter__ python iterator

python - example - ¿Cómo funciona__iter__?



python iter (5)

En Python, un iterador es cualquier objeto que admita el protocolo de iterador. Parte de ese protocolo es que el objeto debe tener un __iter__() que devuelve el objeto iterador. Supongo que esto le da cierta flexibilidad para que un objeto pueda pasar las responsabilidades del iterador a una clase interna, o crear algún objeto especial. En cualquier caso, el __iter__() general tiene solo una línea y esa línea a menudo simplemente return self

La otra parte del protocolo es el next() método, y aquí es donde se realiza el trabajo real. Este método tiene que descubrir o crear u obtener lo siguiente, y devolverlo. Es posible que necesite realizar un seguimiento de dónde está para que la próxima vez que se llame, realmente devuelva lo siguiente.

Una vez que tiene un objeto que devuelve lo siguiente en una secuencia, puede contraer un ciclo for que se ve así:

myname = "Fredericus" x = [] for i in [1,2,3,4,5,6,7,8,9,10]: x.append(myname[i-1]) i = i + 1 # get the next i print x

dentro de esto:

myname = "Fredericus" x = [myname[i] for i in range(10)] print x

Observe que no hay ningún lugar donde tengamos código que obtenga el siguiente valor de i porque el rango (10) es un objeto que SIGUE al protocolo del iterador, y la comprensión de la lista es una construcción que UTILIZA el protocolo del iterador.

También puede USAR el protocolo de iterador directamente. Por ejemplo, al escribir scripts para procesar archivos CSV, a menudo escribo esto:

mydata = csv.reader(open(''stuff.csv'') mydata.next() for row in mydata: # do something with the row.

Estoy usando el iterador directamente al llamar a next() para omitir la fila del encabezado, y luego usarlo indirectamente a través del operador incorporado in en la instrucción for .

A pesar de leer sobre esto, todavía no entiendo muy bien cómo funciona __iter__ . ¿Cuál sería una explicación simple?

He visto def__iter__(self): return self . No veo cómo funciona esto ni los pasos sobre cómo funciona esto.


Las especificaciones para def __iter__(self): son: devuelve un iterador. Entonces, si el self es un iterador, el return self es claramente apropiado.

"Ser un iterador" significa "tener un __next__(self) método" (en Python 3; en Python 2, el nombre del método en cuestión desafortunadamente es el next , en cambio es un error de diseño de nombre para un método especial).

En Python 2.6 y superior, la mejor forma de implementar un iterador es generalmente usar la clase base abstracta apropiada del módulo de biblioteca estándar de collections : en Python 2.6, el código podría ser (recuerde llamar al método __next__ en lugar de a Python 3) :

import collections class infinite23s(collections.Iterator): def next(self): return 23

una instancia de esta clase devolverá infinitamente muchas copias de 23 cuando se itertools.repeat(23) como itertools.repeat(23) ) por lo que el ciclo debe terminarse de lo contrario. El punto es que la subclasificación de collections.Iterator El __iter__ agrega el método __iter__ correcto en su nombre, no es un gran problema aquí, pero es un buen principio general (evite el código repetitivo y repetitivo como el estándar __iter__ una sola línea de los __iter__ ) en repetición, no hay valor agregado y mucho valor restado! -).


Tan simple como puedo decirlo:

__iter__ define un método en una clase que devolverá un iterador (un objeto que sucesivamente cede el siguiente elemento contenido por su objeto).

El objeto iterador que __iter__() devuelve puede ser prácticamente cualquier objeto, siempre que defina un método next() .

El next método será invocado por declaraciones como for ... in ... ejemplo for ... in ... para producir el siguiente artículo, y el next() debería elevar la excepción StopIteration cuando no hay más elementos.

Lo bueno de esto es que le permite definir cómo se itera su objeto, y __iter__ proporciona una interfaz común que todas las demás funciones de python saben cómo trabajar.



Una clase que admita el método __iter__ devolverá una instancia de objeto iterador: un objeto que admita el método next () . Este objeto será útil en las declaraciones "para" y "en".