生成器、迭代器、可迭代对象这三者的关系刚刚开始接触可真是让我头疼,总结图如下:
1、生成器是一种特殊的迭代器,所以生成器一定是迭代器
2、迭代器一定是可迭代对象
3、可迭代对象可以通过iter()方法转化程迭代器
到底什么是可迭代对象?
可迭代对象其实没什么好说的,我们在python编程中就遇到过很多,比如列表、元祖等都是可迭代对象;
可迭代对象:可以返回一个迭代器的对象都可以称之可迭代对象,可迭代对象一定会存在__iter__方法
例如:
迭代器
迭代器:迭代器一定是一个可迭代器对象,可迭代器对象也可以转化程迭代器,同时迭代器肯定会有__next__和__iter__方法,下面我们可以实现一个迭代器
那么这个迭代器到底有什么作用呢?其实迭代器就相当于一个懒工厂,当我们需要当时候就可以调用next()方法返回值,没有需要当时候就等候,例如:
list1 = [1, 2334, 44, 34] inter = iter(list1) print(next(inter)) print(next(inter)) print(next(inter)) print(next(inter))
1 2334 44 34
可以看出:上面就通过next方法将迭代器中的值给取出来了
注意:迭代器中有多少值就只能取几次,超过就会抛出异常:StopIteration
生成器
生成器:生成器是一个特殊的迭代器,定义生成器可以通过两种方式:生成器表达式以及函数形式
生成器表达式:
通过上面可以看出生成器表达式是否有点像列表推倒式,只是[]换成了()
函数形式:如果要用函数的形式实现生成器的话就需要用到yield关键字
注意:生成器中还有一个send方法,该方法是传递值进行替换生成器中的值,但是不能在初始的时候发送值,必须在中间
def iter3(): for i in range(1, 10): num = yield i print(num) a = iter3() print(next(a)) a.send(100) print(next(a))
1
100
None
3
看到上述代码指定结果可以得出:a.send(100)就替换了2这个值,只用None这个值是因为iter()值中的print,因为直接替换了2这个值,那么就不会取到2这个值了,所以num为None