zoukankan      html  css  js  c++  java
  • python生成器,递归调用

    生成器

    什么是生成器:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器

    生成器就是迭代器

    yield的功能

    yield为我们提供了一种自定义迭代器对象的方法

    yield与return的区别:

    1.yield可以返回多个值

    2.函数暂停和再继续是由yield帮我们保存的

     只要看见函数里出现yield,那么就是生成器

    例1:上面我们说到,看见函数里有yield,那么就是生成器,生成器又是迭代器,

    那么提到迭代器就要想到xx.__next__()取值方式

    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循环

    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自定义一个生成器

    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:日志报错监控器

    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的另一用法,赋值

    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

    def num(n):
        if n == 1:
            return 0
        return num(n-1) + 2
    res = num(5) 
    print(res)

    运行结果:

  • 相关阅读:
    【C语言】用"I love you!"打印心形
    android js与控件交互初探。
    android 调用webview控件,为逆向h5app做准备
    git命令
    kdevelp 导入makefile工程
    解决vmvare关闭过慢
    用python.twisted.logfile每天记录日志,并用不记录stdout中的内容
    关于bjam编译自己模块出错的问题
    俄罗斯黑客在美国监狱中获刑4年,到底是什么原因?
    美国的电信巨头T-Mobile今天披露了另一起数据遭黑客泄露事件
  • 原文地址:https://www.cnblogs.com/liketimes/p/10007287.html
Copyright © 2011-2022 走看看