Iterador vs Iterable?

(Para Python 3)

En los documentos de python, puedes ver que la función list() toma un iterable.

En los documentos de Python, también puede ver que la next() función next() toma un iterador.

Así que hice esto en IDLE:

 >>> var = map(lambda x: x+5, [1,2,3]) >>> var >>> next(v) >>> list(v) 

Lo que da la salida:

  6 [7,8] 

Francamente, esto no es lo que esperaba. ¿Es un objeto de mapa un iterador o un iterable? ¿Hay siquiera una diferencia? Claramente, las funciones list() y next() funcionan en el objeto de mapa, sea lo que sea.

¿Por qué ambos trabajan?

Un iterador es un iterable, pero un iterable no es necesariamente un iterador.

Un iterable es cualquier cosa que tenga un método __iter__ definido, por ejemplo, listas y tuplas, así como iteradores.

Los iteradores son un subconjunto de iterables cuyos valores no se pueden acceder todos al mismo tiempo, ya que no todos se almacenan en la memoria a la vez. Estos pueden generarse usando funciones como map , filter y iter , así como funciones que usan el yield .

En su ejemplo, map devuelve un iterador, que también es un iterable, por lo que ambas funciones trabajan con él. Sin embargo, si tomamos una lista por ejemplo:

 >>> lst = [1, 2, 3] >>> list(lst) [1, 2, 3] >>> next(lst) Traceback (most recent call last): File "", line 1, in  next(lst) TypeError: 'list' object is not an iterator 

Podemos ver las next quejas, porque la lista, iterable, no es un iterador .