質問: リストとイテレータの違いについてお聞きしたいです。 https://miga-dev.hatenablog.com/entry/iterator の記事を読みながら、リストとイテレータの違いを調べています。 この記事によると、 リストは最後まで行ってもエラーが出ない、 イテレータは最後まで行くとエラーが出る、ものという認識です。 ただ、このくじで書かれている”状態を記憶する”というのがよく理解できません。 ”状態を記憶する”から、イテレータは最後まで行くとエラーが出るのですか?? ここでいう、”状態を記憶する”ということについての解説と、 リストとイテレータの違いの認識が間違ってないかをお聞きしたいです
回答: ”状態を記憶する”というのは最後に呼ばれたのは誰で、次は誰かを記憶しているということです。 記事にあるようにnext(i)で次が呼び出されるのは、”状態を記憶している”ので次が誰かわかっているからです。 リストは最後まで行ってもエラーが出ない、イテレータは最後まで行くとエラーが出る、 と表現してしまうと語弊があるように思います。 イテレータは”状態を記憶する”ので、最後の要素を呼び出したら、次の要素はいません。という状態になり、このときにnext(i)で次を呼び出せばエラー(StopIteration)になります。 これはリストでも配列数よりも大きいIndexを指定すればエラー(IndexError)になるのと同じです。 リストとイテレータの違いはこんな感じでしょうか? * リスト 0番目:田中さん 1番目:佐藤さん 2番目:鈴木さん * イテレータ 最初は田中さん 田中さんの次は佐藤さん 佐藤さんの次は鈴木さん 鈴木さんは最後 イテレータで鈴木さんまで呼び出したあとに、次を呼び出せば「いません」(StopIteration)ってなるのと一緒で、リストで3番目を指定すれば同じくエラー(IndexError)になりますよね。 その他で違いというと、リストは1番目って指定すれば佐藤さんにアクセスできるけど、イテレータは田中さんの次って呼び出さないと佐藤さんにアクセスできません。 一方で田中さんの次が佐藤さんであることはイテレータの場合は田中さんの次って呼べばわかるけど、リストの場合は田中さんのインデックスを取得して+1して、リストにアクセスしないとわかりません。 このあたりは記事で言うところの最後のシーケンスの説明と一緒ですかね。