首頁  >  文章  >  後端開發  >  python生成器的遞歸呼叫的用法介紹(程式碼範例)

python生成器的遞歸呼叫的用法介紹(程式碼範例)

不言
不言轉載
2018-11-24 16:05:192617瀏覽

這篇文章帶給大家的內容是關於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個,這樣一來一回的過程就是遞推和回溯

python生成器的遞歸呼叫的用法介紹(程式碼範例)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) + 2res = num(5) 
print(res)
#########運行結果:############

以上是python生成器的遞歸呼叫的用法介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除