質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2215閲覧

Pythonのイテレータ・ジェネレータの使いどころ

yamato_user

総合スコア2321

iteratorパターン

iteratorパターンとは、オブジェクト指向プログラミングのデザインパターンです。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とします。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/08/17 02:24

Pythonのイテレータとジェネレータの使いどころはどこですか??

Pythonを勉強したての頃は、「クラスなんて、どこで使うねん!!関数だけで十分やん!!」みたいに思っていましたが、今は「イテレータなんて、どこで使うねん!!リストだけで十分やん!!」と思っています。

下記記載の参考URLを見る限り、メリットは以下の2点と思われました。
0. 省メモリ
アクセスされるたびに値を生成するので、メモリの節約になる

  1. 処理の記憶

  現在処理がどこまで行ったか記憶している

Python

1>>> test_iter = iter([1, 2, 3]) 2>>> for i in test_iter: 3 print(i) 41 52 63 7>>> for i in test_iter: 8 print(i) 9>>>

*1
https://qiita.com/keitakurita/items/5a31b902db6adfa45a70
*2
http://note.crohaco.net/2016/python-iterator-generator-and-tshirt-me/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

イテレータは「リストのように順次値を取り出せるもの」、「forループで処理できるもの」の総称です。
(どちらも本末転倒な定義ですが。ちゃんとした定義・仕様(実装すべきメソッドとか)はご自身で調べてみてください。仕組みがわかると身近に感じられていいですよ)

おそらく、質問の意図は

ジェネレータなんて、どこで使うねん!!リストだけで十分やん!!

というところにあると思います。


質問文にあがっているメリットは「うん、割とその程度だよね」という側面もあるのですが、もう少し違った角度から。

以下のような処理について考えてみましょう。

python

1# 例1 2for x in map(何か重い関数, 長大なリスト): 3 xを使って何らかの処理 4 5# 例2 6for x in map(何か重い関数, 長大なリスト): 7 if xが何らかの条件を満たしたら: 8 break

mapがリストを返すと、

  • 例1では、forループが始まるまでにものすごく待たされます。結果のリストができてからどばどばどばっと中身が処理されます
  • 例2では、同様にforループが始まるまでにものすごく待たされます。breakした後の分まで計算するので、どう考えても無駄です

mapがジェネレータを返すと、

  • 例1では、ループで要素を取り出すたびに計算が走ります。それでもトータルの処理時間は変わりませんが、I/Oやネットワークが絡むなら負荷を集中させないというのは意味があることかもしれません。また、ぽんぽん結果が出てくる(応答時間一定)というのも処理の性質によっては望ましい性質かもしれません
  • 例2では、breakした後の分は計算されないので、経済的です

こういうときには便利かも。

投稿2018/08/17 04:02

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

メリットの2点は正しいと思います。「どこで使うねん」には「どことは言わず結構使うねん」と答えられます。でもリストで十分と考えられるうちは無理に使わなくても良いと思います。必要になった時、もしくは新しい事を習得しようと思った時が使い始めるべき良いタイミングだと思います。

投稿2018/08/17 04:27

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問