生成器是特殊的迭代器,同样可以使用next()获取下一位元素,生成器保存的是算法。
函数内有yield的就是生成器。
yield特点与return特点:
程序在执行的时候遇到yield会暂停,如果yield后面有返回值,先把值返回在暂停,再次启动生成器获取数据的时候会从暂停的对方开始执行。
而return只返回一次值,后面不管多少代码都不执行,但yield可以多次返回。
send:
注意点:如果作用seed函数唤醒生成器,第一次调用send的时候,传入值为None,一般情况下,会使用next来唤醒执行一次。
send使用:
def fibo(num):
a = 0
b = 1
current_index = 0
print(1111111111111111111111111111111111111)
while current_index<num:
print(2222222222222222222222222)
result=a
a,b=b,a+b
current_index+=1
params=yield result
#params是生成器接收到的参数,send传递的参数
print('参数是',params)
if __name__ == '__main__':
ret=fibo(5)
print(ret.send(None))
print(ret.send(1))
print(ret.send(1))
print(ret.send(1))
print(ret.send(1))
使用生成器实现斐波那契:
以及三种执行方法
def fibo(num):
a = 0
b = 1
current_index = 0
while current_index<num:
result=a
a,b=b,a+b
current_index+=1
yield result
if __name__ == '__main__':
#第一种执行方法
# fibo(5)
# for i in ret:
# print(i)
#第二种执行方法
ret=fibo(5)
while True:
try:
result1=next(ret)
print(result1)
except BaseException as e:
print(e)
break
#第三种执行方法
# print(next(ret))
# print(next(ret))
# print(next(ret))
# print(next(ret))
使用迭代器实现斐波那契:
class Rib:
def __init__(self,month):
'''
初始化操作,需要传入控制的次数
:param month: 控制生成对应的数据
'''
self.month=month
self.a=0
self.b=1
self.current_index=0#当前迭代的次数的索引
def __iter__(self):
return self
def __next__(self):
if self.current_index<self.month:
result=self.a
self.a,self.b=self.b,self.a+self.b
self.current_index+=1
return result
else:
raise StopIteration
if __name__ == '__main__':
rib=Rib(10)
for i in rib:
print(i)