Pythonイールドの使用例の分析

この記事では、Pythonのyieldの使用法について説明します。次のように、参照用にあなたと共有してください:

英語のyieldは生産を意味します。Pythonに最初に触れたとき、私は非常に混乱し、yieldの使用法を理解していませんでした。

次の例のように、yieldを使用して関数の戻り値のデータを詰め込むことができるのは大まかな考えです。

def addlist(alist):for i in alist:yield i +1

alistの各アイテムを取り出し、i +1を入れます。次に、次の電話で各アイテムを取り出します。

alist =[1,2,3,4]for x inaddlist(alist):
 print x,

これは確かに歩留まりアプリケーションの例です

1. 歩留まりを含む関数

関数にyieldが含まれている場合は、この関数がすでにジェネレーターであり、その実行が他の通常の関数とはかなり異なることを意味します。たとえば、次の単純な関数:

def h():
 print 'To be brave'yield5h()

ご覧のとおり、h()を呼び出した後、printステートメントは実行されません。これはyieldなので、printステートメントを実行するにはどうすればよいですか?これは後で説明する問題です。以下の説明と学習を通じて、歩留まりの動作原理を理解できます。

2. 歩留まりは式です

Python 2.5以前は、yieldはステートメントでしたが、2.5では、yieldは次のような式になります。

m =yield5

式の戻り値(歩留まり5)はmに割り当てられるため、m = 5と考えるのは誤りです。では、(利回り5)の戻り値を取得するにはどうすればよいでしょうか。後で導入するsend(msg)メソッドを使用する必要があります。

3. next()ステートメントで原則を参照してください

それでは、歩留まりの動作原理を明らかにしましょう。上記のh()はyield式を持っているため、呼び出された後は実行されないことがわかっているので、next()ステートメントを介して実行させます。 next()ステートメントは、次のyield式までジェネレーターの実行を再開します。といった:

def h():
 print 'Wen Chuan'yield5
 print 'Fighting!'
c =h()
c.next()

c.next()が呼び出された後、h()はyield 5に到達するまで実行を開始するため、出力結果は次のようになります。

Wen Chuan

再度c.next()を呼び出すと、次のyield式が見つかるまで実行が続行されます。後でyieldがないため、例外がスローされます。

Wen Chuan
Fighting!
Traceback (most recent call last):
File “/home/evergreen/Codes/yidld.py”, line 11, in <module
c.next()
StopIteration

4. send(msg)およびnext()

next()がyieldを含む関数を実行する方法を理解した後、別の非常に重要な関数send(msg)を見てみましょう。実際、next()とsend()は、ある意味で同様の関数を持っています。違いは、send()はyield式の値を渡すことができますが、next()は特定の値を渡すことはできず、Noneのみを渡すことができるということです。したがって、次のように見ることができます

c.next()とc.send(None)は同じ効果があります。

この例を見てください:

def h():
 print 'Wen Chuan',
 m =yield5 # Fighting!
 print m
 d =yield12
 print 'We are together!'
c =h()
c.next() #cと同等.send(None)
c.send('Fighting!') #(yield5)式が与えられます'Fighting!'

出力結果は次のとおりです。

Wen Chuan Fighting!

初めて呼び出すときは、next()ステートメントまたはsend(None)を使用してください。sendを使用してNone以外の値を送信することはできません。そうしないと、この値を受け取るyieldステートメントがないためエラーが発生します。

**5. send(msg)およびnext()**の戻り値

send(msg)とnext()には戻り値があり、それらの戻り値は非常に特殊であり、次のyield式のパラメーターを返します。たとえば、yield 5の場合、5が返されます。この時点で、あなたは何かを理解していますか?この記事の最初の例では、alist内のfor iを介してジェネレーターをトラバースすると、実際には毎回alist.Next()が呼び出され、alist.Next()の戻り値がyieldのパラメーターになるたびに、つまり、次のようになります。東洞は押し込んだ。上記の例を続けましょう:

def h():
 print 'Wen Chuan',
 m =yield5 # Fighting!
 print m
 d =yield12
 print 'We are together!'
c =h()
m = c.next() #mはyield5のパラメータ値5を取得します
d = c.send('Fighting!') #dはyield12のパラメータ値12を取得します
print 'We will never forget the date', m,'.', d

出力結果:

Wen Chuan Fighting!
We will never forget the date 5 . 12

6. throw()およびclose()割り込みジェネレーター

ジェネレーターの中断は非常に柔軟な手法です。GeneratorExit例外をスローすることでジェネレーターを終了できます。 Close()メソッドの機能は同じですが、内部的にはthrow(GeneratorExit)を呼び出します。私たちは見ます:

def close(self):try:
 self.throw(GeneratorExit)except(GeneratorExit, StopIteration):
 pass
 else:
 raise RuntimeError("generator ignored GeneratorExit")
# Other exceptions are not caught

したがって、close()メソッドを呼び出してからnext()またはsend(msg)を呼び出すと、例外がスローされます。

Traceback (most recent call last):
File “/home/evergreen/Codes/yidld.py”, line 14, in <module
d = c.send( 'Fighting!')#dはyield12のパラメーター値12を取得しました
StopIteration

Pythonの詳細については、このサイトのトピック「Pythonデータ構造とアルゴリズムのチュートリアル」、「Pythonソケットプログラミングスキルの概要」、「Python関数の使用スキルの概要」、「Python文字列操作のスキルの概要」、「Pythonの概要」を参照してください。上級クラシックコース」

この記事がPythonプログラミングに役立つことを願っています。

Recommended Posts

Pythonイールドの使用例の分析
wavファイルのPython分析
PythonクローラーのJSの分析
Pythonサンドボックスエスケープの分析
Pythonオブジェクト指向プログラミングの分析
PythonWebページパーサーの使用例の詳細な説明
pythonでのwheelの使用法
Python条件付き制御ステートメントの分析
Pythonでの辞書の詳細な使用法
pythonでのosパッケージの使用
python定義クラスの簡単な使用法
python操作redisのいくつかの例
Pythonモジュールの知識の完全な分析
pythonでのタプルの使用法
Pythonタートルライブラリ実装の基本的な分析
Python3クローラーでのAjaxの使用
Pythonガベージコレクションメカニズムの詳細な分析
python標準ライブラリのglobの分析
Python仮想環境venvの使用法の詳細な説明
Pythonマルチプロセスプログラミングの一般的な方法の分析
Python3.9の7つの機能
100の小さなPythonの例
Pythonデータ分析
C言語プログラムを呼び出すPythonのメソッド分析
pythonでのリストの意味と使用法
Pythondecimalモジュールの使用法の詳細な説明
Python操作の一般的なメソッドの分析Jiraライブラリ
AI自動マットサンプル分析のPython実装
Pythonを使用してKSを計算する詳細な例
Python3組み込みモジュールの使用法
Python線形補間分析
Python構文の基本
Pythonの高度な使用法の概要
Pythonの基本構文
Pythonの基礎知識(1)
pythonのPrettytableモジュール
PythonでのMongoDBの使用
09.Python3の共通モジュール
ubuntuの使用法の概要
Liunx(centos8)でのyumの基本的な使用法と例(推奨)
Pythonの基盤を統合する(4)
Pythonの上位関数の使用法の概要!
Python(7)の基盤を統合する
pythonリスト(LIST)の深い理解
Pythonのタプルの添え字
Python(6)の基盤を統合する
Python3クローラーデータクリーニング分析
栄光のパイソンキング壁紙
Python(5)の基盤を統合する
gomokuプログラムのPython実装
Python3.10のいくつかの新機能
Pythonマルチスレッドの深い理解
OpenCVインストールのPythonバージョン
Pythonデータサイエンス:関連分析
Pythonの9つの機能エンジニアリング手法
python描画モジュールのmatplotlib
パラメータを渡すPythonメソッド
Pythonの基盤を統合する(3)
Python共通モジュールのコレクション
Pythonの上位関数の使用法の概要!
Pythonクローラーアドバンストエッセンシャル|インデックス分析プラットフォームの復号化ロジック分析