生成器是特殊的迭代器,一边循环一边计算的机制
生成器语法`
def func():
i = 0
while i<10:
param = yield i
print(param)
i+=1
注意点:
1、函数,函数体内包含yield
2、生成一个生成器
g1 = func()
g1才是一个生成器
唤醒生成器的方法:
print(g.next())
print(next(g))
print(g.send(None))
注意点:
1、可以使用__next__
2、可以使用next
3、可以使用send,但是在唤醒生成器的时候,必须传入参数None
例子
#斐波拉切数列
def fb(month):
m=0
a,b=0,1
while m<month:
yield b
a,b=b,a+b
m+=1
if __name__ == '__main__':
ret = fb(5)
print(type(ret))
for iten in ret:
print(iten) #可以用for循环输出
# ret.send(None)#用send是唤醒,第一次只能用None,不能直接传参
return和yield的异同点
相同的点:都可以返回数据
不同点:
1、return在当前函数体中,后面的代码不执行
2、yield在生成器中,返回数据,但是在下一次调用的时候,会将yield后面的代码执行完,再执行之前的内容
生成器注意点
1、有些数据受内存的影响,数据集合的容量是有限的
2、创建了一个100万个元素的数据,需要很大的储存空间,我们需要使用100个数据,后面的数据比较占用空间
3、生成器存储着生成元素的算法,一边循环,一边计算
生成器的实现有俩种方法第一种适用比较简单的情况,第二种是算法比较复杂的
#这是第一种
g=(x for x in range(10))
for i in g:
print(i)
#第二种
def fb(month):
m=0
a,b=0,1
while m<month:
a,b=b,a+b
m+=1
if __name__ == '__main__':
ret = fb(5)
print(type(ret))
for iten in ret:
print(iten) #可以用for循环输出
# ret.send(None)#用send是唤醒,第一次只能用None,不能直接传参