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

投稿者: Anonymous

下記のブログでリストとイテレータについて書かれているのですが、理解表現があります。

Pythonのリストはイテレーターでない。わかりやすい(はずの)イテレーターとイテラブルの説明

なぜリスト自身がイテレータの場合一度ループしただけでリストはループ出来なくなってしまうのでしょうか?
この場合のループとは for in を指しているのでしょうか?その場合なぜループできなくなるのか分からないです。ブログでは for in の内部ではイテレータによる処理が行われているという説明までされています。

もしリスト自身がイテレーターであれば、1度ループしただけでリストはループできなくなってしまいます(ループの進行状況が管理されるので)。 そのために、リスト自身ではなくリストイテレーターさん(つまりイテレーター)にループの状況を管理してもらっています。Pythonってすごい!

追記

どうやら for in にイテレータは渡せるみたいです。

ループでは使用できないという表現がよく分からないです。

イテレーターは同時にイテラブルでもあります。 なので、イテレーターは for in … に渡せます。この場合、イテレーターは iter(my_iterator) をすると my_iterator 自身を返します。

解決

プログのリンクが不明で, たぶんここかな?と

言ってることは, (イテレーターだと) 使い切ってしまうと それ以上は使えない … ですね。
リストの場合

lst = [10,20,30]
for i in lst:
  print(i)
# 10
# 20
# 30

for i in lst:
  print(i)
# 10
# 20
# 30

ジェネレーターの場合

def gen1():
  for n in [10,11,12]:
    yield n

g1 = gen1()
for i in g1:
  print(f'1度目 {i}')
# 10
# 11
# 12

for i in g1:
  print(f'2度目 {i}')
# 出力なし

ファイルの場合 (試してないけど)

with open('dummydata') as fp:
  for ln in fp:
    print(ln)
  for ln in fp:
    print(ln)
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *