Python ジェネレーターの再帰呼び出しの使用方法の紹介 (コード例)

不言
リリース: 2018-11-24 16:05:19
転載
2599 人が閲覧しました

この記事では、Python ジェネレーターの再帰呼び出しの使用法 (コード例) を紹介します。一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。

ジェネレーター

ジェネレーターとは: 関数本体に 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))
ログイン後にコピー

# の value メソッドを考える必要があります。 ##実行結果:

この値を取得する方法を理解したら、同じ原理で別の簡単な方法を考えるでしょう。それが 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 バックトラッキング

例: A、B、C、D、と E、5 人でバンズを食べます。A がバンズを何個食べたかを知りたいのですが、A は B よりも良いと言いました。さらに 2 個食べます。B は C より 2 個多く食べたと言いました。C は C より 2 個多く食べたと言いました。 D. 丁は E より 2 個多く食べたと言いました。E は食べなかったと言いました。 では、E が食べていないことを知っていたので、A、B、C の答えによると、と D の場合、A が 8 個食べたことがわかっているため、前後のプロセスは再帰と後戻りです。年齢(A) = 年齢(B) 2

年齢(B) = 年齢(C) 2

年齢(C) = 年齢(D) 2

年齢(D) = 年齢(E) 2

年齢(E) = 0

def num(n):    
if n == 1:        
return 0    
return num(n-1) + 2res = num(5) 
print(res)
ログイン後にコピー

実行結果:

以上がPython ジェネレーターの再帰呼び出しの使用方法の紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!