リストとイテレータの違いについてお聞きしたいです。
https://miga-dev.hatenablog.com/entry/iterator
の記事を読みながら、リストとイテレータの違いを調べています。
この記事によると、
リストは最後まで行ってもエラーが出ない、
イテレータは最後まで行くとエラーが出る、ものという認識です。
ただ、このくじで書かれている”状態を記憶する”というのがよく理解できません。
”状態を記憶する”から、イテレータは最後まで行くとエラーが出るのですか??
ここでいう、”状態を記憶する”ということについての解説と、
リストとイテレータの違いの認識が間違ってないかをお聞きしたいです
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
・リストは順番が決められたデータの集団を表すデータ構造
・イテレータはデータの集団に対し順番にアクセスしていくためのオブジェクト
です。
エラーが出るか出ないかは、ライブラリの仕様の問題であり、リストとイテレータという概念とは関係のないものです。
「状態を記憶する」というのは、イテレータという仕組みを実現するために実装として必要になるだけであって本質には関係ありません。
データ構造がリストであってもツリーであっても、順次にアクセスするためのオブジェクトをイテレータと呼びます。
投稿2019/04/11 01:39
総合スコア164
0
ベストアンサー
”状態を記憶する”というのは最後に呼ばれたのは誰で、次は誰かを記憶しているということです。
記事にあるようにnext(i)で次が呼び出されるのは、”状態を記憶している”ので次が誰かわかっているからです。
リストは最後まで行ってもエラーが出ない、イテレータは最後まで行くとエラーが出る、
と表現してしまうと語弊があるように思います。
イテレータは”状態を記憶する”ので、最後の要素を呼び出したら、次の要素はいません。という状態になり、このときにnext(i)で次を呼び出せばエラー(StopIteration)になります。
これはリストでも配列数よりも大きいIndexを指定すればエラー(IndexError)になるのと同じです。
リストとイテレータの違いはこんな感じでしょうか?
- リスト
0番目:田中さん
1番目:佐藤さん
2番目:鈴木さん
- イテレータ
最初は田中さん
田中さんの次は佐藤さん
佐藤さんの次は鈴木さん
鈴木さんは最後
イテレータで鈴木さんまで呼び出したあとに、次を呼び出せば「いません」(StopIteration)ってなるのと一緒で、リストで3番目を指定すれば同じくエラー(IndexError)になりますよね。
その他で違いというと、リストは1番目って指定すれば佐藤さんにアクセスできるけど、イテレータは田中さんの次って呼び出さないと佐藤さんにアクセスできません。
一方で田中さんの次が佐藤さんであることはイテレータの場合は田中さんの次って呼べばわかるけど、リストの場合は田中さんのインデックスを取得して+1して、リストにアクセスしないとわかりません。
このあたりは記事で言うところの最後のシーケンスの説明と一緒ですかね。
投稿2019/04/11 01:53
総合スコア317
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
見ている記事がちょっとずれた記述をしているような……
記事で書いているのは「イテレータによるアクセスと、リストのインデックスによるアクセスの違い」というのが正しいところです。
イテレータは「順序を持つ集合」に対して、「順序通りにアクセスするための手段を提供するもの」です。
そして「順序を持つ集合」の一つとして、リストがあります。(他には配列もそうです)
つまりイテレータは「リストへアクセスする方法の一つ」なのです。
ですからイテレータとリストを比べる、という事自体が勘違いになります。
投稿2019/04/11 01:42
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/11 02:21
2019/04/11 04:37
0
以下にリストのイテレータを書きました。このコードの中で 状態 というのは self._index
になります。状態というよりもリストの 現在位置 みたいなものですかね。
python
1class Iterator: 2 def __init__(self, container): 3 self._container = container 4 self._index = 0 # <--- これです 5 6 def __iter__(self): 7 return self 8 9 def __next__(self): 10 if self._index < len(self._container): 11 element = self._container[self._index] 12 self._index += 1 13 return element 14 else: 15 raise StopIteration 16 17 18iterator = Iterator(['Yaruo', 'Yaranaio', 'Yarumi']) 19for element in iterator: 20 print(element)
... Yaruo Yaranaio Yarumi >>>
投稿2019/04/11 01:43
編集2019/04/11 01:58総合スコア830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。