一、概念
#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
def func():
print('====>first')
yield 1
print('====>second')
yield 2
print('====>third')
yield 3
print('====>end')
print('====>first')
yield 1
print('====>second')
yield 2
print('====>third')
yield 3
print('====>end')
g=func()
print(g) #<generator object func at 0x0000000002184360>
print(g) #<generator object func at 0x0000000002184360>
# 生成器:自定义的迭代器
# 函数内但凡出现yield关键字,再调用函数,不会触发函数体代码的运行
# 会得到一个返回值,该返回值就是一个生成器对象,也就是自定义的迭代器
# 函数内但凡出现yield关键字,再调用函数,不会触发函数体代码的运行
# 会得到一个返回值,该返回值就是一个生成器对象,也就是自定义的迭代器
二、yield与return的区别
# yield与return
# 相同点:都能返回值
# 不同点:yield能返回多次值,而return只能返回一次值函数就立即结束
# 相同点:都能返回值
# 不同点:yield能返回多次值,而return只能返回一次值函数就立即结束
三、练习

#题目一: def my_range(start,stop,step=1): while start < stop: yield start start+=step #执行函数得到生成器,本质就是迭代器 obj=my_range(1,7,2) #1 3 5 print(next(obj)) print(next(obj)) print(next(obj)) print(next(obj)) #StopIteration #应用于for循环 for i in my_range(1,7,2): print(i)

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.2) def grep(pattern,lines): for line in lines: line=line.decode('utf-8') if pattern in line: yield line for line in grep('404',tail('access.log')): print(line,end='') #测试 with open('access.log','a',encoding='utf-8') as f: f.write('出错啦404 ')
二、yield与return的区别