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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

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

Q&A

解決済

4回答

9109閲覧

リストとイテレータの違いについて

taiyo2017

総合スコア170

Python

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

0グッド

2クリップ

投稿2019/04/11 01:23

リストとイテレータの違いについてお聞きしたいです。
https://miga-dev.hatenablog.com/entry/iterator
の記事を読みながら、リストとイテレータの違いを調べています。

この記事によると、
リストは最後まで行ってもエラーが出ない、
イテレータは最後まで行くとエラーが出る、ものという認識です。

ただ、このくじで書かれている”状態を記憶する”というのがよく理解できません。
”状態を記憶する”から、イテレータは最後まで行くとエラーが出るのですか??

ここでいう、”状態を記憶する”ということについての解説と、
リストとイテレータの違いの認識が間違ってないかをお聞きしたいです

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

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

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

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

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

guest

回答4

0

・リストは順番が決められたデータの集団を表すデータ構造
・イテレータはデータの集団に対し順番にアクセスしていくためのオブジェクト
です。

エラーが出るか出ないかは、ライブラリの仕様の問題であり、リストとイテレータという概念とは関係のないものです。

「状態を記憶する」というのは、イテレータという仕組みを実現するために実装として必要になるだけであって本質には関係ありません。

データ構造がリストであってもツリーであっても、順次にアクセスするためのオブジェクトをイテレータと呼びます。

投稿2019/04/11 01:39

devneko64bit

総合スコア164

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

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

0

ベストアンサー

”状態を記憶する”というのは最後に呼ばれたのは誰で、次は誰かを記憶しているということです。
記事にあるようにnext(i)で次が呼び出されるのは、”状態を記憶している”ので次が誰かわかっているからです。

リストは最後まで行ってもエラーが出ない、イテレータは最後まで行くとエラーが出る、
と表現してしまうと語弊があるように思います。

イテレータは”状態を記憶する”ので、最後の要素を呼び出したら、次の要素はいません。という状態になり、このときにnext(i)で次を呼び出せばエラー(StopIteration)になります。
これはリストでも配列数よりも大きいIndexを指定すればエラー(IndexError)になるのと同じです。

リストとイテレータの違いはこんな感じでしょうか?

  • リスト

0番目:田中さん
1番目:佐藤さん
2番目:鈴木さん

  • イテレータ

最初は田中さん
田中さんの次は佐藤さん
佐藤さんの次は鈴木さん
鈴木さんは最後

イテレータで鈴木さんまで呼び出したあとに、次を呼び出せば「いません」(StopIteration)ってなるのと一緒で、リストで3番目を指定すれば同じくエラー(IndexError)になりますよね。

その他で違いというと、リストは1番目って指定すれば佐藤さんにアクセスできるけど、イテレータは田中さんの次って呼び出さないと佐藤さんにアクセスできません。
一方で田中さんの次が佐藤さんであることはイテレータの場合は田中さんの次って呼べばわかるけど、リストの場合は田中さんのインデックスを取得して+1して、リストにアクセスしないとわかりません。

このあたりは記事で言うところの最後のシーケンスの説明と一緒ですかね。

投稿2019/04/11 01:53

mackerel6.023

総合スコア317

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

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

taiyo2017

2019/04/11 09:38

ありがとうございます。一番わかりやすかったので、BAに選ばせて下さい!
guest

0

見ている記事がちょっとずれた記述をしているような……
記事で書いているのは「イテレータによるアクセスと、リストのインデックスによるアクセスの違い」というのが正しいところです。

イテレータは「順序を持つ集合」に対して、「順序通りにアクセスするための手段を提供するもの」です。
そして「順序を持つ集合」の一つとして、リストがあります。(他には配列もそうです)
つまりイテレータは「リストへアクセスする方法の一つ」なのです。
ですからイテレータとリストを比べる、という事自体が勘違いになります。

投稿2019/04/11 01:42

tacsheaven

総合スコア13703

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

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

magichan

2019/04/11 02:21

比べる対象が間違っているのは完全に同意なのですが、通常のfor文の場合「インデックスによりアクセス」しているのではなく、単に「暗黙的にイテレータを再生成している」ので問題なく再実行できるだけような気がします。
tacsheaven

2019/04/11 04:37

まあそこら辺は python の for 文だから、なので。
guest

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
nico25

総合スコア830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問