本文摘自php中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于python生成器的递归调用的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。生成器
什么是生成器:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器
生成器就是迭代器
yield的功能
yield为我们提供了一种自定义迭代器对象的方法
yield与return的区别:
1.yield可以返回多个值
2.函数暂停和再继续是由yield帮我们保存的
只要看见函数里出现yield,那么就是生成器
例1:上面我们说到,看见函数里有yield,那么就是生成器,生成器又是迭代器,
那么提到迭代器就要想到xx.__next__()取值方式
1 2 3 4 5 6 7 8 9 10 11 | def test():
print ( '=====>1' )
yield 1
print ( '=====>2' )
yield 2
print ( '=====>3' )
yield 3
g = test() #就相当于一个容器
print (g.__next__())
print (g.__next__())
print (next(g))
|
运行结果:

我们知道这种方式取值之后,就会想到相同原理的另一个简单方式就是for循环
1 2 3 4 5 6 7 8 9 10 | def test():
print ( '=====>1' )
yield 1
print ( '=====>2' )
yield 2
print ( '=====>3' )
yield 3
g = test()
for i in g:
print (i)
|
运行结果:

例2:将test1的结果被test2调用,这是就需要用yield自定义一个生成器
1 2 3 4 5 6 7 8 | def test1():
for i in range(10):
yield i #把0~9变成生成器返回给函数test1
g = test1() #g是个生成器
def test2(g):
for i in g:
print (i)
test2(g)
|
运行结果:

例3:日志报错监控器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import time
def tail(filepath): #定义一个查看文件的函数
with open(filepath, 'rb' ) as f: #打开形参为filepath rb是二进制读
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' , '500' ) #监控a.txt最新日志,并过滤500的错误代码
|
一旦有500出现就会被抓拍到

yield的另一用法,赋值
1 2 3 4 5 6 7 8 9 10 | def test(name):
while True:
foot = yield
print ( '%s正在吃%s' % (name, foot))
e = test( '轩轩' ) #e是生成器
next(e) #初始化,e.__next__()
# e.send(None) #初始化,与上一行二选一
e.send( '饺子' ) #发送值传给foot
e.send( '冰激凌' ) #发送值传给foot
|
运行结果:

递归调用
递归调用:在调用一个函数的过程中,直接或者间接又调用了函数本身,称之为递归调用
递归必备的2个阶段:1递推,2回溯
例:甲乙丙丁戊,5人吃包子,我们想知道甲吃了几个包子,但甲说比乙多吃2个,乙说比丙多吃2个,丙说比丁多吃2个,丁说比戊多吃2个,戊说他没吃,
那么因为知道戊没吃,所以根据甲乙丙丁的答案,我们可知甲吃了8个,这样一来一回的过程就是递推和回溯
age(甲) = age(乙) + 2
age(乙) = age(丙) + 2
age(丙) = age(丁) + 2
age(丁) = age(戊) + 2
age(戊) = 0
1 2 3 4 5 | def num(n):
if n == 1:
return 0
return num(n-1) + 2res = num(5)
print (res)
|
运行结果:

以上就是python生成器的递归调用的用法介绍(代码示例)的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
Python 查找字符在字符串中的位置实例
Python画图的两种方法
Python二进制怎么转十进制?
Python的序列之列表的通用方法
Python占位符怎么输入
Python数据分析需要什么基础
学会了Python语言能做什么
装了anaconda要卸载Python吗
Python怎么自学要那本书
Python如何调用r
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » python生成器的递归调用的用法介绍(代码示例)