生成器、迭代器、可迭代对象
生成器、迭代器、可迭代对象这三者的关系刚刚开始接触可真是让我头疼,总结图如下:
1、生成器是一种特殊的迭代器,所以生成器一定是迭代器
2、迭代器一定是可迭代对象
3、可迭代对象可以通过iter()方法转化程迭代器
到底什么是可迭代对象?
可迭代对象其实没什么好说的,我们在python编程中就遇到过很多,比如列表、元祖等都是可迭代对象;
可迭代对象:可以逐一返回其成员中的对象都可以称之可迭代对象,所以可迭代对象都是可以进行for循环的。可迭代对象实现了__iter__()方法
例如:
迭代器
首先明白,迭代器是继承于可迭代对象的,在此基础上,实现了__next__()方法
迭代器:迭代器一定是一个可迭代器对象,可迭代器对象也可以转化程迭代器,同时迭代器肯定会有__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
所有的可迭代对象都可以通过iter方法转化为迭代器
迭代器对象能够使用next方法和__next__()来实现迭代操作
所有的迭代器都是可迭代对象,但是可迭代对象不一定是迭代器
迭代器存在__next()__方法和__iter()__方法
生成器
生成器:生成器是一个特殊的迭代器,继承于迭代器,自己生成了send、throw、close方法,生成器只是存数据生成的方式,不存数据
定义生成器可以通过两种方式:生成器表达式以及函数形式
生成器表达式:
通过上面可以看出生成器表达式是否有点像列表推倒式,只是[]换成了()
函数形式:如果要用函数的形式实现生成器的话就需要用到yield关键字
注意:生成器中还有一个send方法,该方法是传递值进行替换生成器中的值,但是不能在初始的时候发送值,必须在中间
def iter3(): for i in range(1, 10): num = yield i print(num) a = iter3() # 获取生成器对象 print(next(a)) # 启动生成器,此时会停止在yield处 a.send(100) # 使用send方法传值给了生成器中的num,执行这里会从上面的yield那一步执行,直接将值赋给num,然后执行print(num),再执行到yield处停止
print(next(a))
1
100
None
3
看到上述代码指定结果可以得出:a.send(100)执行逻辑:将100赋值给了num,执行了print(num),所以打印出了100,然后会停止在yield处,在执行print(next(a))就会从yield处执行,因为没有send,所以num为None,则打印出了None,
然后在执行到yield处返回了3