只要函数体内有yield,执行该函数体代码时就不会执行函数体代码,会得到一个结果,该结果就是生成器(generator)
def func(): print('=================>1') yield 1 print('=================>2') yield 2 print('=================>3') yield 3 print('=================>4') yield 4 func()
该函数执行结果如下所示:
生成器就是迭代器
def func(): print('=================>1') yield 1 print('=================>2') yield 2 print('=================>3') yield 3 print('=================>4') yield 4 #生成器就是迭代器
x=func()
next(x)
next(x)
next(x)
next(x)
yield的功能
1 yield为我们提供一种自定义迭代器对象的方法
2 yield与return的区别
2.1yield可以返回多次值
2.2函数暂停与再继续的状态是由yield帮我们保存的
函数体代码示范1
def my_range(start,end,step): yield 1 yield 2 yield 3 g=my_range(1,5,2) print(next(g)) print(next(g)) print(next(g))
函数体代码示范2
#只要函数体代码内有yield 该函数体代码就不会运行,会被当做生成器
<generator object my_range at 0x030A9EA0>
def my_range(start,end,step): while start<end: yield start start+=step res=my_range(1,5,2) print(next(res)) print(next(res))
函数体代码示范3
def my_range(start,end,step=1): while start<end: yield start start=start+step res=my_range(1,7,2) #<generator object my_range at 0x00569060> print(res) for i in my_range(1,9,2): print(i)
函数体代码示范4
#
# 实现tail -f access.log | grep 404的功能
#写入文件代码 with open('access.log','a',encoding='utf-8') as f: f.write('aaaaa ') f.flush()
#执行文件端代码 import time def tail(filepath): with open(filepath,'rb') as f: f.seek(0,2) while True: line=f.readline() if line: yield line else: time.sleep(0.5) line=tail('access.log') for i in line: print(i)
yield附加案例
def eater(name):
print('%s is ready to eat'%name)
while True:
food=yield
print('%s is start to eat %s'%(name,food))
e=eater('nod')
#首先初始化
next(e) #此处可以写成e.send(None)
#然后send从第一步e暂停的地方开始继续往下执行
e.send('一只鸡')
e.send('一只鸭')