この記事では、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