この記事では、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 サイトの他の関連記事を参照してください。