python生成器 递归
生成器
生成器:只要函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器
生成器就是迭代器
yield的功能
1、yield为我们提供了一种自定义迭代器对象的方法
2、yield于return的区别:
1)yield可以返回多个值
2)函数暂停和再继续是由yield帮我们保存的
def test(): print('=== >1') yield 1 print('=== >2') yield 2 print('===>3') yield 3 g = test() #print里的值由yield保存 for i in g: print(i)
def test1(): for i in range(10): yield i g = test1() def test2(g): #调用生成器 for i in g: print(i) test2(g)
#监控日志
import time def tail(filepath): #定义一个查看文件的函数 with open(filepath,'rb') as f: #以二进制的形式打开filepath f.seek(0,2) while True: #循环监控日志 data = f.readline() #读取文件末尾 if data: #加入有数据就用yield返回 yield data else: #否则睡眠0.05秒 time.sleep(0.05) def grep(file,k): #定义过滤关键字函数 for i in tail(file): #循环生成器中的数据 if k in i.decode('utf-8'): #因为是用二进制服务方式,所有需要解码显示 print(i.decode('utf-8')) # grep('a.txt',404) #监控a.txt最新日志,并过虑404的错误代码
yield赋值
def test(name): while True: foot = yield print('%s正在吃%s' %(name,foot)) e = test('1807') next(e) #初始化 e._next_() e.send(None) #初始化 e.send('choudoufu') #发送值传给foot e.send('冰激凌')
递归调用:在调用一个函数的过程中,直接或者间接又调用了函数本身,称之为递归调用
递归必备的2个阶段:
1递归
2 回溯
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 0
def love(n):
if n == 1:
return 0
return love(n-1) + 2
res = love(5)
print(res)