1.迭代的概念

上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值

2.可迭代的对象

内置 iter 方法的,都是可迭代的对象。 list是可迭代对象,dict是可迭代对象,set也是可迭代对象。

3.迭代器

1.为什么要有迭代器?

对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式。

2.迭代器定义:

迭代器:可迭代对象执行 iter 方法,得到的结果就是迭代器,迭代器对象有 next 方法

它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了 iternext ()方法的对象都是迭代器, iter 返回迭代器自身, next 返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常

二、生成器

1.定义

生成器(generator)是一个特殊的迭代器,它的实现更简单优雅,yield是生成器实现 next ()方法的关键。它作为生成器执行的暂停恢复点,可以对yield表达式进行赋值,也可以将yield表达式的值返回。

也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。

yield的功能:

1.相当于为函数封装好 iternext 2.return只能返回一次值,函数就终止了,而yield能返回多次值,每次返回都会将函数暂停,下一次next会从上一次暂停的位置继续执行

为什么说生成器是一种迭代器?

Python 判断一个对象是否是迭代器的标准是看这个对象是否遵守迭代器协议 ,判断一个对象是否遵守迭代器协议主要看两个方面:

1对象首先得实现 iternext 方法

2其次 iter 方法必须返回它自己

而生成器恰好满足了这两个条件(可以自己写个生成器,然后调用生成器的这两个方法试试)。我们平常还会经常碰到另外一个概念:可迭代对象。可迭代对象就是可迭代的对象,可迭代的对象就是说我们可以从这个对象拿到一个迭代器。在 Python 中,iter 方法可以帮我们完成这个事情,也就是说,可迭代对象和迭代器满足这样一个关系:iter(iterable) -> iterator。

在 Python 中,list 是个可迭代对象,所以我们经常会写这样的代码:

>>> l = [1, 2, 3]
>>> for element in l:
...     print(element)

但你想过为什么我们可以这么写吗?为啥在 c 语言里面,我们访问数组元素的时候,必须要通过 index?

因为:list 是个可迭代对象,我们在 Python 中使用 for … in 时,Python 会给我们生成一个迭代器对象,而如上所说:迭代器是个数据流,它可以产生数据,我们一直从里面取数据就好了,而不需要我们在代码中维护 index,Python 已经通过迭代器给我们完成了这个事情。