1.什么是生成器
比较下面:value遍历的数据全部存在numbers中,不需要的数据也会产生; 而aa是一个生成器,需要数据的时候才生成. numbers = [value for value in range(1, 20)] print(numbers) 这里的aa就是一个生成器 aa = (value for value in range(1, 20)) print(aa) 总结: a.生成器产生的一个数据,生成算法,产生的数就没有用. b.生成器就是保存产生数据的算法,在使用的时候一个一个的产生相应的数据. c.产生的过程与母鸡下蛋的过程一样.对产生的数据不会再产生.
2.通过__next__去拿到生成的每一个数.
aa = (value for value in range(1, 20)) print(aa) print(aa.__next__()) #>>>1 print(aa.__next__()) #>>>2 print(aa.__next__()) #>>>3 print(aa.__next__()) #>>>4 print(aa.__next__()) #>>>5 当我们需要使用数据的时候才产生一个数据 aa = (value for value in range(1, 20)) print(aa) print(aa.next()) #>>>1 print(aa.next()) #>>>2 print(aa.next()) #>>>3 print(aa.next()) #>>>4 print(aa.next()) #>>>5 #前面拿了5个数. for x in aa: print(x) #这里从6开始产生,前面产生的5个数不再产生 总结:生成器generator保存产生数据的算法,每次只产生一个数据,并且已经产生后的数据不会再重复产生.
3.yield关键字
a.yield是在函数里面用的
b.执行yield语句,就会将yield后面的值缓存起来
c.函数结束后返回一个生成器,生成器可以生产的数据就是之前通过yield缓存的数据
d.yield是一个用法跟return很相似的关键字,不同在于函数返回的是一个生成器
def foo(n): for x in range(1, n): yield x #>>>1, 2, 3, 4 return 100 aa = foo(5) print(aa) for i in aa: print(i)
例如:斐波拉契数列:1, 1, 2, 3, 5, 8, 13, 21, 33
def sequence(n): num_1 = 0 num_2 = 1 for x in range(1, n+1): yield num_2 #yield相当于一个容器,缓存数据 ,让yield缓存到的数据去创建 一个生成器,可以生产缓存到的数据的生成器,并且返回. # print(num_2) num_1,num_2 = num_2, num_1 + num_2 aa = sequence(10) print(aa.__next__()) for x in aa: print(x) numbers = list(sequence(10)) #将生成器转换成列表 print(numbers) 总结: 如果函数中有yield关键字,那么函数返回值就是generator类型 使用范围:通过算法拿到这个数据,不是别人产生的数据拿来用的时候.