迭代: 通过for循环遍历对象的每一个元素的过程。在Python中,list/tuple/string/dict/set/bytes都是可以迭代的数据类型。

迭代器: 是一种可以被遍历的对象,并且能作用于next()函数。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往后遍历不能回溯,不像列表,你随时可以取后面的数据,也可以返回头取前面的数据。迭代器通常要实现两个基本的方法:iter()和 next()



[注意]:迭代器只能前进不能后退

[迭代器的优点]:

使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。



可迭代对象包含迭代器。 如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。 定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。 凡是可作用于for循环的对象都是可迭代类型; 凡是可作用于next()函数的对象都是迭代器类型; list、dict、str等是可迭代的但不是迭代器,因为next()函数无法调用它们。可以通过iter()函数将它们转换成迭代器.



Python的for循环本质上就是通过不断调用next()函数实现的。字符串,列表或元组对象,甚至自定义对象都可用于创建迭代器.

lis = [1,2,3,4]
it = iter(lis)          # 创建迭代器对象
for x in it:            # 使用for循环遍历迭代对象
    print (x, end=" ")
>>> lis=[1,2,3]
>>> it = iter(lis)     # 使用Python内置的iter()方法创建迭代器对象
>>> next(it)           # 使用next()方法获取迭代器的下一个元素
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)            # 当后面没有元素可以next的时候,弹出错误
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    next(it)
StopIteration

__iter__方法返回自己



>>> a = (i*i for i in range(2))
>>> a.__iter__()
<generator object <genexpr> at 0x7fcbbc0a6780>



__next__方法返回下一个值



>>> a = (i*i for i in range(2))
>>> a.next()
0
>>> a.next()
1
>>> a.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

可以被for循环调用并不断返回下一个值的对象是可迭代对象。

可以被next方法调用并返回下一个值的对象是迭代器

列表元组字典字符串集合是可迭代对象无法被直接next调用。

迭代器,可迭代对象,生成器区别

python 迭代器用法 python中迭代器的作用_迭代