今回はPythonにおけるyield文について、やさしく解説していきたいと思います。
この記事では
- yieldとは
- イテレータとジェネレータとは
- yieldの基本的な使い方
- yield fromの使い方
など、基本的な内容から、より実践的な内容に関してもわかりやすく解説していきたいと思います。yield文についてわからなくても、基礎からしっかりと解説していきます!
※この記事のコードはPython 3.7で動作確認しました。
この記事の目次
yieldとは
yieldは、関数を一時的に実行停止させることが出来る機能を持つ文です。
その時点での戻り値を返し、そしてまた再開させることができます。yieldについて知るには、イテレータとジェネレータについて知らなければなりません。
イテレータとジェネレータ
Pythonにはイテレータとジェネレータという概念があります。
イテレータとは、反復して要素を取り出すことが出来る型のことを言います。Pythonのリストやセット、辞書型はイテレーションすることが出来るので、これらのオブジェクトはイテレータになります。
また、ジェネレータは、イテレータの一種になります。要素を取り出すごとに処理を実行して、要素を生成することが出来ます。
そしてこのジェネレータを、yieldを使って作ることが出来ます。
yieldを使うメリットとは
yieldを使うメリットについて解説します。
例えば、return文でそのまま値を返す関数を作ったとします。一度に大きなリストが返ってくるような関数だと、たくさんのメモリを一度に消費してしまうことになります。
そのようなときは、yieldを使う事でその莫大な量の戻り値を小分けにして返すことが出来ます。これによって関数の実行をその都度中断し、少量ずつデータを返す事でメモリの消費量を抑えることが出来るようになります。
yieldの基本的な使い方
では、yieldの基本的な使い方をご紹介していきたいと思います。
yieldは、基本的には関数の中で使われる文になります。
基本的な構文は、
になります。
こちらのコードをご覧ください。
こちらのコードはreturn文のように、その関数が返す値を指定しています。
基本的にはこのような構文で実行することが出来るのですが、これではyieldのありがたみがあまりわからないかもしれません。
そこで、forループ内でyieldを使う方法について、解説していきたいと思います。
forループ内でyieldを使う方法
yieldは、forループの中で一般的に使われます。
こちらのコードをご覧ください。
実行結果
こちらのコードでは、myfuncという関数内にyield文を3つ使っています。
forループは関数内で使用したyieldを全て処理するまで作動し続けます。
forループ内のみの解説だとわかりにくいかもしれないので、Ipythonで対話的にmyfuncを呼び出し実際にどう動いているのかを見てみましょう。
こちらのIPython shellでの例ををご覧ください。
こちらのコードではIPythonを使って、先ほどと同じmyfuncを定義しています。
forループを使った時とは違いyieldの回数分、__next__()というメソッドを呼びだすことで、先ほどと同じ結果を得ることができましたね。
こうすることで、yieldでその都度返してほしい値がきちんと返ってくることが確認出来ます。
また、yieldを含む関数の中でfor文を使うこともできます。
ジェネレータでyieldを使う方法
forループの外でyieldを使う方法もあります。
先程解説したように、yieldを含む関数はジェネレータになります。
先ほどのIPythonを使用したサンプルコードでも少し触れたnext関数というとても便利な関数について解説します。
こちらのコードをご覧ください。
実行結果
こちらのコードでは、yieldを含む関数を呼び出してジェネレータを格納するオブジェクトを作成しました。
ジェネレータのnext関数は、yieldまでの処理を実行しその都度、値を返します。今回は3つのyieldを使用したので3回、nextを呼びました。
実は、Python3以前のバージョンに存在していたnextメソッドが無くなったのですが、その代わりとして__next__()メソッドが導入されました。
__next__()はアンダースコア付きの特殊メソッドであるため、nextという組み込み関数が用意されました。
今回ご紹介したnext関数は、特殊メソッドの__next__()を呼び出してくれます。
yieldの数よりも多くnextを呼ぶと、このようなエラーが出力されるので注意してくださいね。
yield fromについて
では、基本的なyieldを使う方法を学んだところで、yield fromについて解説したいと思います。
yield fromは主に、ジェネレータを小さく分割する為に使います。これはPython3.3から追加された構文なので、それ以前のバージョンでは使用出来ません。
yield fromの使い方
では、実際にyield fromを使ったコードをご紹介したいと思います。
こちらのコードをご覧ください。
実行結果
こちらのコードでは、まず二つのジェネレータであるgenerator1とgenerator2を作成しました。そして、二つのジェネレータをまとめるgeneratorという名前のジェネレータを作成しました。
さらに、先ほどのサンプルコードのように、generatorを呼び出し変数genに格納しました。そして、そのジェネレータをforループ内で処理させました。
実行結果を確認すると、generator1ジェネレータが実行されその後generator2ジェネレータが実行されています。
まとめ
この記事では、yieldを使う基本的な方法をご紹介しました。
特に覚えておきたいことは、
- イテレータとジェネレータについて
- 繰り返し処理はyieldを使うとメモリの消費が少ない
- forループ内での処理かジェネレータのnext関数を使う
- まとめたいときはyield fromを使う
になります。
もしyieldの使い方を忘れてしまったときは、ぜひこの記事を読み返してみてください。
Pythonカリキュラム無料公開中!
この記事はPython入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。Python学習に必要な情報を一つにまとめていますので効率よくPythonを学ぶことが出来ます。この機会に是非活用していただければと思います。
Pythonを最短で習得したい方へ
元々ITリテラシーの高い方やプログラムの学び方がわかっている方であれば、この記事通りに進めていけば、Pythonを独学で習得することができるでしょう。ただし、実際の学習期間中はつまづいている時間がほとんどです。
このような悩みを抱えている方も少なく無いと思います。「なかなかやり遂げられ無い、挫折してしまった」
「時間が足りない」
「情報が少なくどう調べればいいかわからない」
「エラーを解決することができない」
- もう挫折したくない
- 本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい
- 自分だけのカリキュラムで効率的に勉強したい
お一人お一人に専属のインストラクターがつくので、通常のスクールでは難しい、AI(人工知能)や機械学習、IoTについて学習することできます。
まずは『無料体験レッスン』で、弊社のコンサルタントと一緒にあなた専用の学習方やカリキュラムを考えてみませんか?
Pythonならではの学習方法や、現役Pythonエンジニアから貴重なアドバイスを受けることができます。
詳しくは下の画像をクリックして弊社サービス内容をご確認ください。