La iteración es un término general para tomar cada elemento de algo, uno tras otro. Cada vez que usa un bucle, explícito o implícito, para repasar un grupo de elementos, eso es iteración.
En Python, iterable e iterator tienen significados específicos.
Un iterable es un objeto que tiene un __iter__
método que devuelve un iterador , o que define un __getitem__
método que puede tomar índices secuenciales a partir de cero (y aumenta IndexError
cuando los índices ya no son válidos). Entonces, un iterable es un objeto del que puede obtener un iterador .
Un iterador es un objeto con un método next
(Python 2) o __next__
(Python 3).
Siempre que use un for
bucle, o map
, o una comprensión de lista, etc. en Python, el next
método se llama automáticamente para obtener cada elemento del iterador , pasando así por el proceso de iteración .
Un buen lugar para comenzar a aprender sería la sección de iteradores del tutorial y la sección de tipos de iteradores de la página de tipos estándar . Después de comprender los conceptos básicos, pruebe la sección de iteradores del CÓMO de programación funcional .
collections.abc.AsyncIterator
pruebas__aiter__
y los__anext__
métodos. Esta es una nueva adición en 3.6.__len__
necesariamente vinculado a la iteración? ¿Cómo le ayudaría saber la longitud de algo?__getitem__
.{'a': 'hi', 'b': 'bye'}
tiene una longitud de 2, pero no puede indexarse por 0, 1 o 2.__iter__
método. Creo que jlh se refiere a objetos que son iterables específicamente porque definen: "un__getitem__
método que puede tomar índices secuenciales a partir de cero".Aquí está la explicación que uso al enseñar clases de Python:
Un ITERABLE es:
for x in iterable: ...
oiter()
eso devolverá un ITERATOR:iter(obj)
o__iter__
que devuelve un ITERATOR nuevo, o puede tener un__getitem__
método adecuado para la búsqueda indexada.Un ITERATOR es un objeto:
__next__
método que:StopIteration
__iter__
método que devuelveself
).Notas:
__next__
método en Python 3 se deletreanext
en Python 2, ynext()
llama a ese método en el objeto que se le pasa.Por ejemplo:
fuente
for
bucles, y la primera viñeta trata de "hacer un bucle". ¿Podría por favor abordar estos?iter()
" como "cualquier cosa a la que pueda pasariter()
"Las respuestas anteriores son geniales, pero como la mayoría de lo que he visto, no enfatice la distinción lo suficiente para personas como yo.
Además, las personas tienden a ponerse "demasiado pitónicas" al poner definiciones como "X es un objeto que tiene
__foo__()
método" antes. Dichas definiciones son correctas: se basan en la filosofía de tipear patos, pero el enfoque en los métodos tiende a interponerse cuando se trata de comprender el concepto en su simplicidad.Entonces agrego mi versión.
En lenguaje natural,
En Python
iterable es un objeto que es, bueno, iterable, lo que simplemente significa que puede usarse en iteración, por ejemplo, con un
for
bucle. ¿Cómo? Mediante el uso de iterador . Te lo explicaré a continuación.... mientras que el iterador es un objeto que define cómo hacer la iteración, específicamente cuál es el siguiente elemento. Por eso debe tener
next()
método.Los iteradores también son iterables, con la distinción de que su
__iter__()
método devuelve el mismo objeto (self
), independientemente de si sus elementos han sido consumidos o no por llamadas anteriores anext()
.Entonces, ¿qué piensa el intérprete de Python cuando ve una
for x in obj:
declaración?Como Mr.
obj
tuvo éxito en esta prueba (al hacer que cierto método devuelva un iterador válido), lo recompensamos con un adjetivo: ahora puede llamarlo "Mr. iterableobj
".Sin embargo, en casos simples, normalmente no se beneficia de tener iterador e iterable por separado. Por lo tanto, define solo un objeto, que también es su propio iterador. (A Python realmente no le importa que lo
_i
entregadoobj
no fuera tan brillante, sino solo elobj
mismo).Es por eso que en la mayoría de los ejemplos que he visto (y lo que me había estado confundiendo una y otra vez), puede ver:
en vez de
Sin embargo, hay casos en los que puede beneficiarse de tener un iterador separado del iterable, como cuando desea tener una fila de elementos, pero más "cursores". Por ejemplo, cuando desea trabajar con elementos "actuales" y "próximos", puede tener iteradores separados para ambos. O múltiples hilos que se extraen de una gran lista: cada uno puede tener su propio iterador para recorrer todos los elementos. Ver las respuestas de @ Raymond y @ glglgl arriba.
Imagina lo que podrías hacer:
Notas:
Repetiré nuevamente: el iterador no es iterable . Iterator no se puede utilizar como "fuente" en
for
bucle. Lo que elfor
bucle necesita principalmente es__iter__()
(que devuelve algo connext()
).Por supuesto,
for
no es el único ciclo de iteración, por lo que lo anterior también se aplica a algunas otras construcciones (while
...).Los iteradores
next()
pueden lanzar StopIteration para detener la iteración. Sin embargo, no tiene que hacerlo, puede iterar para siempre o usar otros medios.En el "proceso de pensamiento" anterior,
_i
realmente no existe. He inventado ese nombre.Hay un pequeño cambio en Python 3.x:
next()
ahora se debe invocar el método (no el incorporado)__next__()
. Sí, debería haber sido así todo el tiempo.También puede pensarlo así: iterable tiene los datos, el iterador extrae el siguiente elemento
Descargo de responsabilidad: no soy desarrollador de ningún intérprete de Python, por lo que realmente no sé qué "piensa" el intérprete. Las reflexiones anteriores son únicamente una demostración de cómo entiendo el tema a partir de otras explicaciones, experimentos y experiencias de la vida real de un novato en Python.
fuente
for
bucle necesita un iterador ("Mire, un bucle for. Parece un trabajo para un iterador ... Consigamos uno"). Pero luego dices en las notas al final que "Iterator no se puede usar como fuente en unfor
bucle" ...?pass
en el código para esasnext
definiciones? Asumiré que solo quiere decir que alguien tiene que implementar una forma de obtener el siguiente, ya que el siguiente tiene que devolver algo.pass
es , después de todo.)pass
, creo que está ahí por razones sintácticas. Acabo de encontrar las respuestas en el objeto de puntos suspensivos que son bastante interesantes: puede usar...
para indicar un bloque "todo más tarde".NotImplemented
También está disponible.for
bucle '. Recibo el punto de su respuesta, y me gusta de otra manera, pero creo que sería beneficioso arreglar esto.Un iterable es un objeto que tiene un
__iter__()
método. Posiblemente puede repetirse varias veces, comolist()
s ytuple()
s.Un iterador es el objeto que itera. Se devuelve mediante un
__iter__()
método, se devuelve mediante su propio__iter__()
método y tiene unnext()
método (__next__()
en 3.x).La iteración es el proceso de llamar a esto
next()
resp.__next__()
hasta que subaStopIteration
.Ejemplo:
fuente
Iterable
.Iterator
es siempreIterable
y es propioIterator
, dos llamadas deiter()
no necesariamente dan dosIterator
s independientes .Aquí está mi hoja de trucos:
Prueba: ¿Ves cómo ...
__iter__()
método de un objeto contenedor se puede implementar como generador?__next__
método no es necesariamente un iterador?Respuestas:
__iter__
método. Tener__iter__
es suficiente para ser iterable. Por lo tanto, cada iterador es iterable.Cuando
__iter__
se llama, debe devolver un iterador (return <iterator>
en el diagrama anterior). Llamar a un generador devuelve un iterador generador que es un tipo de iterador.Aquí hay un ejemplo:
fuente
__iter__
método. ¿Puede explicar los puntos segundo y tercero editando esta respuesta__iter__()
devuelve un iterador. Un generador es un iterador, por lo que puede usarse para este propósito. re 3 .: Solo puedo adivinar aquí, pero creo que si__iter__()
falta o no regresaself
, no es un iterador, porque el iterador__iter__()
tiene que regresarself
.No sé si ayuda a alguien, pero siempre me gusta visualizar conceptos en mi cabeza para comprenderlos mejor. Entonces, como tengo un hijo pequeño, visualizo el concepto iterable / iterador con ladrillos y papel blanco.
Supongamos que estamos en el cuarto oscuro y en el piso tenemos ladrillos para mi hijo. Ladrillos de diferente tamaño, color, no importa ahora. Supongamos que tenemos 5 ladrillos como esos. Esos 5 ladrillos se pueden describir como un objeto , digamos kit de ladrillos . Podemos hacer muchas cosas con este kit de ladrillos: puede tomar uno y luego tomar el segundo y luego el tercero, puede cambiar los lugares de los ladrillos, colocar el primer ladrillo por encima del segundo. Podemos hacer muchas cosas con ellos. Por lo tanto, este kit de ladrillos es un objeto o secuencia iterable , ya que podemos atravesar cada ladrillo y hacer algo con él. Solo podemos hacerlo como mi pequeño hijo: podemos jugar con un ladrillo iterable . a la vez . Así que de nuevo me imagino que este kit de ladrillos es un
Ahora recuerda que estamos en el cuarto oscuro. O casi oscuro. La cuestión es que no vemos claramente esos ladrillos, de qué color son, qué forma, etc. Por lo tanto, incluso si queremos hacer algo con ellos, es decir, iterar a través de ellos , realmente no sabemos qué y cómo porque es demasiado oscuro.
Lo que podemos hacer es cerca del primer ladrillo, como elemento de un kit de ladrillos, podemos poner un trozo de papel fluorescente blanco para que podamos ver dónde está el primer elemento de ladrillo. Y cada vez que sacamos un ladrillo de un kit, reemplazamos el trozo de papel blanco por otro ladrillo para poder verlo en el cuarto oscuro. Este papel blanco no es más que un iterador . Es un objeto también . Pero un objeto con el que podemos trabajar y jugar con elementos de nuestro objeto iterable: kit de ladrillos.
Eso, por cierto, explica mi error inicial cuando intenté lo siguiente en un IDLE y obtuve un TypeError:
La Lista X aquí fue nuestro kit de ladrillos, pero NO un trozo de papel blanco. Primero necesitaba encontrar un iterador:
No sé si ayuda, pero me ayudó. Si alguien pudiera confirmar / corregir la visualización del concepto, estaría agradecido. Me ayudaría a aprender más.
fuente
Iterable : - algo que es iterable es iterable; como secuencias como listas, cadenas, etc. También tiene el
__getitem__
método o un__iter__
método. Ahora, si usamos laiter()
función en ese objeto, obtendremos un iterador.Iterador : - Cuando obtenemos el objeto iterador de la
iter()
función; Llamamos__next__()
método (en python3) o simplementenext()
(en python2) para obtener elementos uno por uno. Esta clase o instancia de esta clase se llama iterador.De documentos: -
El uso de iteradores impregna y unifica Python. Detrás de escena, la instrucción for invoca
iter()
el objeto contenedor. La función devuelve un objeto iterador que define el método__next__()
que accede a los elementos en el contenedor de uno en uno. Cuando no hay más elementos,__next__()
genera una excepción StopIteration que le indica al ciclo for que finalice. Puede llamar al__next__()
método utilizando lanext()
función incorporada; Este ejemplo muestra cómo funciona todo:Ex de una clase: -
fuente
No creo que pueda hacerlo mucho más simple que la documentación , sin embargo, intentaré:
Puede pensar Iterator como un pseudo-método auxiliar (o pseudo-atributo) que le da (o mantiene) el siguiente (o primer) elemento en el iterable . (En la práctica, es solo un objeto que define el método
next()
)La iteración probablemente se explica mejor por la definición de la palabra Merriam-Webster :
fuente
entonces,
iterable
es un objeto que se puede recorrer . por ejemplo, lista, cadena, tupla, etc.El uso de la
iter
función en nuestroiterable
objeto devolverá un objeto iterador.ahora este objeto iterador tiene un método llamado
__next__
(en Python 3, o solonext
en Python 2) por el cual puede acceder a cada elemento de iterable.entonces, LA PRODUCCIÓN DEL CÓDIGO ANTERIOR SERÁ:
1
2
fuente
Luciano Ramalho, pitón fluido.
fuente
Antes de tratar con los iterables y el iterador, el factor principal que decide el iterable y el iterador es la secuencia
Secuencia: Secuencia es la recopilación de datos.
Iterable: Iterable son los objetos de tipo secuencia que admiten el
__iter__
método.Método Iter: el método Iter toma la secuencia como entrada y crea un objeto que se conoce como iterador
Iterator: Iterator es el objeto que llama al siguiente método y atraviesa la secuencia. Al llamar al siguiente método, devuelve el objeto que atravesó actualmente.
ejemplo:
x es una secuencia que consiste en la recopilación de datos
Al llamarlo
iter(x)
, devuelve un iterador solo cuando el objeto x tiene un método iter; de lo contrario, genera una excepción. Si devuelve un iterador, y se asigna así:Como y es un iterador, por lo tanto, admite el
next()
métodoAl llamar al siguiente método, devuelve los elementos individuales de la lista uno por uno.
Después de devolver el último elemento de la secuencia, si llamamos nuevamente al siguiente método, se genera un error StopIteration
ejemplo:
fuente
En Python todo es un objeto. Cuando se dice que un objeto es iterable, significa que puede recorrer (es decir, iterar) el objeto como una colección.
Las matrices, por ejemplo, son iterables. Puede recorrerlos con un bucle for y pasar del índice 0 al índice n, siendo n la longitud del objeto de matriz menos 1.
Los diccionarios (pares de clave / valor, también llamados matrices asociativas) también son iterables. Puedes pasar por sus llaves.
Obviamente, los objetos que no son colecciones no son iterables. Un objeto bool, por ejemplo, solo tiene un valor, verdadero o falso. No es iterable (no tendría sentido que sea un objeto iterable).
Lee mas. http://www.lepus.org.uk/ref/companion/Iterator.xml
fuente
iter()
los tipos de colección estándar son iterables pero no son, en sí mismos, colecciones.