-
创建生成器的第一重方式
-
创建生成器的方法2(定义一个函数,让这个函数变成生成器)
例如:1 1 2 3 5 8 13…
定义函数:
def fib(num):
a,b,count =0,1,1
while count <= num:
print(b)
a,b =b,a+b
count +=1
fib(10)
- 如果在调用函数的时候,发现这个函数中有yeild
那么此时,也就不是调用函数了,而是创建了一个生成器对象
def creat_num(all_num):
print('~~~~~~~~~~~1~~~~~~~~~~~`')
a,b=0,1
current_num = 0
while current_num < all_num:
print('~~~~~~~~~2~~~~~~~~~~~')
yield a #相当于暂停了程序
print('~~~~~~~~~3~~~~~~~~~~~~')
a,b = b,a+b
current_num +=1
print('~~~~~~~~~4~~~~~~~~~~~~~')
obj = creat_num(5)
print(obj)
调用显示函数:
注意:调用次数过多,生成器里面没有东西,程序就会报错
例如:
obj = creat_num(5)
print(obj)
ret = next(obj)
print(ret)
ret1 = next(obj)
print(ret1)
ret2 = next(obj)
print(ret2)
ret3 = next(obj)
print(ret3)
ret4 = next(obj)
print(ret4)
ret5 = next(obj)
print(ret5)
显示:
此时.我们发现程序会报错,可以采用以下方式排查:
while True:
try:
ret = next(obj)
print('obj:',ret)
except Exception as red:
print(red.value)
break
用for 循环做:
for num in obj:
print(num)
两个生成器对象之间并没有任何关系
obj2 = creat_num(100)
print(obj2)
ret4 = next(obj2)
print(ret4)
- 使用send唤醒程序
使用send()函数来唤醒程序执行,使用send()函数的好处是可以在唤醒的同时向断点中传入一个附加的数据
例如:
def creat_num(all_num):
a,b =0,1
current_num = 0
while current_num < all_num:
ret = yield a
print(’>>>>>>>>ret>>>>>>>>>’,ret)
a,b = b,a+b
current_num +=1
obj =creat_num(5)
red = next(obj)
print(red)
red = obj.send(None)
print(red)
5 next 和send的区别
next和send得到的都是yield后面的值
不同的是send传递值而next不传递值
注意:
不能把send放在第一个,因为第一次执行程序是从开始执行
并没有值来接收send
如果你非要把send放在第一个,那么传递的值应该是None