一、生成器
1、定义
但凡在函数内部定义了yield,调用函数时,函数代码体不会执行,得到的返回值就是一个生成器。
生成器内置有__iter__()和__next__()方法,所以生成器本质就是一个迭代器。
2、关键字:yield
若函数体内包含yield关键字,在调用函数时,并不会执行函数体代码,得到的返回值即是生成器对象。
def my_range(start,stop,step=1):
while start < stop:
yield start
start += step
#g_range就是一个生成器
g_range = my_range(1,5,2)
print(g_range) #<generator object my_range at 0x000000000293D8E0>
#for循环迭代
for i in my_range(1,9,2):
print(i)
3、yield 与return 的区别
区别 yield return
相同点 返回值的个数都是无限的 返回值的个数都是无限的
不同点 返回多个值 返回一个值
二、yield表达式应用
def init(func):
def wrapper(*args,**kwargs):
g = func(*args,**kwargs)
next(g)
return g
return wrapper
@init
def eater():
print(‘ready to eat’)
while True:
food = yield
print(‘get the food:%s,and start to eat’%food)
g= eater()
g.next()
g.send(‘bone’)
g.send(‘milk’)
g.send(‘bread’)