python生成器的递归调用的用法介绍(代码示例)


本文摘自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)

运行结果:

1524044-20181123165023649-1671032211.png

以上就是python生成器的递归调用的用法介绍(代码示例)的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

如何用Python开发网页

Python能开发单片机吗

Python编写一个三级while的循环菜单实例

Python通过伪装头部数据抵抗反爬虫

Python中的os模块

Python描述符的用法介绍(附示例)

Python read()方法定义及使用(实例解析)

Python必须装虚拟机吗

Python利用smtplib实现qq邮箱发送邮件

Python numpy怎么提取矩阵的指定行列

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...