ページへ戻る
− Links
印刷
Python/yieldでループを効率化
の編集 ::
NJF Wiki
xpwiki
:
Python
/
yieldでループを効率化
の編集
# t31c98e6 の編集
ページ内容:
*Pythonのyieldとは [#t31c98e6] yieldはジェネレーター関数を作るための関数です。 ジェネレーター関数はイテレーターを簡単に作成するための関数で、イテレーターとは繰り返し処理のことです。 特にPythonでは、ジェネレーター関数を使うとforループなどを効率よく書けるようになります。 例えば、 def yieldTest(): yield 1 yield 2 yield 3 for i in yieldTest(): print i 結果: 1 2 3 となり、yieldで設定した値がループで使えるようになっています。 ループではなく、「next」という関数で一つずつ値を取り出すことも出来ます。 yt = yieldTest() print next(yt) print next(yt) print next(yt) print next(yt) 結果: 1 2 3 Traceback (most recent call last): File "yieldtest.py", line 19, in <module> print next(yt) StopIteration 値が無くなると例外が発生します。forループではnextを使って例外が発生するまで値を取り出している、と考えて良いでしょう。 このとき、注意すべきなのは、ジェネレーター関数は呼び出されたときに全ての処理を行うわけではないことです。つまり。nextが呼ばれると、yieldの場所で処理が止まり、次のnextで再びその場所から処理が始まります。 例えば次のように関数を変更した場合、処理が一回ずつ止まっていることがわかります。 def yieldTest(): print "yield 1" yield 1 print "yield 2" yield 2 print "yield 3" yield 3 yt = yieldTest() print next(yt) print next(yt) print next(yt) 結果: yield 1 1 yield 2 2 yield 3 3 最初に「yieldTest」を呼び出したときに全ての処理が行われているわけではないことがわかります。 そのため、ジェネレーター関数に無限ループがあったとしても問題ありません。 def yieldTest(): i = 0 while True: i += 1 yield i yt = yieldTest() print next(yt) print next(yt) print next(yt) 結果: 1 2 3 もしyieldTestを呼び出したときに処理がまとめて行われるのであれば、無限ループのせいでこのコードは実行時に止まってしまいますが、そうはなりません。nextが呼び出されるたびに、次のyieldが呼び出されるまで処理が行われるためです。 実際にジェネレーター関数を使う時には、このようにループの中にyieldを書くことが多いでしょう。
編集の要約:
Q & A 認証:
ページ更新時は次の質問にお答えください。(プレビュー時は必要ありません)
Q:
日本の首都は?(漢字で)
A:
お名前:
タイムスタンプを変更しない
テキスト整形のルールを表示する
[1]
Links list
(This host) = https://njf.jp
(This host)
/cms/modules/xpwiki/?cmd=edit&help=true&page=Python%2Fyield%E3%81%A7%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E5%8A%B9%E7%8E%87%E5%8C%96