day13
迭代器:for 循环可以循环的就是可迭代对象
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
可以被for循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。用dir查看
from collections import Iterable
print(isintance(li,list)) 返回true或者false
type判断类型
可迭代对象转换迭代器 .__iter__()
.__next__()
迭代器的好处:节省内存空间,满足惰性机制,不能反复取值(不可逆)
while 循环模拟
l = [1,2,3,4] l_iter = l.__iter__() while True: try: item = l_iter.__next__() print(item) except StopIteration: break
我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存。
如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。
Python中提供的生成器:
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
生成器Generator:
本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
特点:惰性运算,开发者自定义
产生方式:
1,生成器函数构造
2,生成器推导式构造
3,数据类型转换
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,
调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。
每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
g称作生成器对象
一个yield对应一个next
send和next一样都是执行一次
senf还可以为上一次yield赋值
注意:第一次使用生成器用next取下次值,最后一次yield不能赋值
l = [i for i in range(10)] print(l) l1 = ['选项%s'%i for i in range(10)] print(l1)
1.把列表解析的[]换成()得到的就是生成器表达式
2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和: