とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサードリンク

Pythonのイテレーターを理解する

WindowsでPython シリーズ その19


Pythonのイテレーターとジェネレーターについて学んでおきます。
最近のオブジェクト指向言語であればだいたい備えてる機能。

イテレーターは知らず知らずのうちに使ってるけど、ジェネレーターを自分で実装することなんて・・・殆どない。
それに説明を読んでもサッパリわからん。
安心してください!
演算子(オペレーター)のオーバーロードぐらい、意識して使うことは殆どありません。

※ブログ主は、C#言語で誰ぞが自己満足か技術確認のために組んだであろう
クラスのオペレーターのオーバーロード及び意味のないジェネレーターが多数宣言されたコードを泣きながらメンテナンスしたことがあります。
その時に習得したC#言語での知識を元に本記事を記載しています。
Python使いの方が本エントリを読んで誤ったであると判断した場合は、コメント欄でご指摘いただければ幸いです。



なので、とりあえずこの回はこんなもんなんだなという程度で流します。

イテレーターとは


繰り返し処理の元データとして利用できるデータの塊のこと。
代表例はリスト型
strs = ["とまと","りんご","みかん"]
for s in strs:
print(s)
--------------
結果
とまと
りんご
みかん
こんな感じで、for ~~ in の後ろに指定できるものです。

このイテレーターの説明を古いプログラミング言語に当てはめるとフェッチというものに代用できます。
要するに、「連続したデータを順番に送り出すよ。なくなったらエラーになるよ」という概念です。

元になる概念がある以上、その概念を具現化できる命令も存在します。
それが
iter()

イテレーターはオブジェクトです。
iter()はイテレーターのオブジェクトを返します。
んで、その返ってきたオブジェクトを next()によってフェッチできます。

ではコードを。


実行結果
Pythonのイテレーターを理解する

iter()によって取り出したイテレーターオブジェクトを変数に代入し、
next()によって一つ一つ取り出しています。
これはfor文が内部的に行っている挙動です。
4回目のnext()でStopIteration 例外が返ってきてます。
リストが3つしかないので、4回目でエラーが出ているわけですね。

ジェネレーターとは


ジェネレーターはイテレーターを自分で実装する時に使う概念です。
マニュアルを見てもサッパリですね。
この辺の概念って、始めてプログラム学ぶ人にとってどうやって説明すればいいんでしょうね。ほんと吐きそう。

とにもかくにも、キーワードはyield です。

yieldとは

自分で作った関数を for 文で使いたいな。
そんな風に思った時に使います。
巨大なパッケージソフトを作ってて、独自に作ったフレームワークを利用した方が効率的だと判断された時ぐらいにしか使います。
よって、基本的には使いません。
既に実装されている機能で殆ど代用できます。

文句言ってても仕方ないので書いてみます。


実行結果
Pythonのイテレーターを理解する

最初に、関数を定義しています。
この関数は、3で割り切れる数の場合、yieldと書いています。
関数はreturn で返すのが通例ですが、yieldは、処理結果の全てを保持します。
具体的には、3の倍数だからreturnしても、その続きから処理が繰り返し行われる感じです。

戻り値はイテレーターオブジェクトとなり、iter()で取得できるようになります。
その結果for文のデータ元として利用できるようになり、実行結果は見ての通り、指定した引数に対して3で割り切れる値のみを返すようになります。

ジェネレーターをもっと分かりやすく


yieldがわかりにくい?

yieldはその場所で処理が中断されて、また再開する。
そんな感じで覚えてもOK。



実行結果
Pythonのイテレーターを理解する

適当にyieldばっかり書いてる関数を使って呼び出してみました。
yield 1
yield 2 ... と結果が返ってきています。

正直いってこんなの使わないので、「へ~」ぐらいで覚えておけばいいです。

が、、、自分で実装をしないだけで、コーディング中にfor を使う場合は必ずイテレーターという概念が裏で動いています。
それだけは意識しておけば、プログラムを組むことがさらに楽しくなると思います。

ではでは、このエントリが日の目を見ることを祈って。
楽しきPythonライフを!
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/179-294b2a3a
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。