デカ文字Python

デカ文字&短文でPythonを簡潔にまとめたブログ

Pythonにおけるイテレータ

 

はじめに

Pythonの教科書を見ていると、forやinの項目でよくイテレータ(iterator)という言葉が出てくる。どうやら繰り返しを意味する言葉らしい。けど、どういうものなのか説明されることもなくさらっと流される。

 

これはPython特有のものではなく、C++JavaScriptにもあるプログラム用語だからのようだ。改めてPythonの教科書で説明することもないじゃん、ってこと。けど、初めて触ったプログラム言語がPythonの人にとっては未知の概念。

 

そうこうして困っていると、とても分かりやすく整理しているブログがあった。

 

note.crohaco.net

 

とても助かりました♨

 

f:id:pokita:20180513212945p:plain


上はそのブログからのiteratableなオブジェクトの関係図の引用です。

 

iterableとは

 iterableなオブジェクトとは、一言で言うならiteratorになり得る(able)オブジェクト、ということ。もう少し具体的に言うと、__iter__.()メソッドを持つオブジェクト、ということである。

iter()関数は引数のオブジェクトが.__iter__()メソッドを戻す関数であることから、あるオブジェクトがiterableか否かについては、help()関数で構造を見るほかには、iter()関数の引数とすることでも判別可能。

help(str)
>>>・・・・・・・・・・
|__iter__(self, /)
| Implement iter(self).

#strは.__iter__()メソッドを持つためiterableと言える

iter(1)
>>>TypeError: 'int' object is not iterable

#intはiterableではないためiter()関数の引数にするとエラーを起こす

 

ところでiteratorってなに…?

 

 iteratorとは

 iteratorオブジェクトとは、一言でいうと.__next__()メソッドが実装されているオブジェクトのこと。

 

.__next__()メソッド?

 

 .__next__()メソッドは、オブジェクトの要素を放出するという働きがある。next()関数は引数オブジェクトの.__next__()メソッドを戻すため、iteratorか否かはhelp()関数か、next()関数を使って調べることができる。

z = zip("spam", [i for i in range(10) if i % 2 == 0])
help(z)

>>>・・・・・・・・・・・・
| __iter__(self, /)
| Implement iter(self).

 

z = zip("spam", [i for i in range(10) if i % 2 == 0])
print(next(z))
>>>('s', 0)
print(next(z))
>>>('p', 2)
print(next(z))
>>>('a', 4)

 

zipオブジェクトはiteratorなので、next関数を使うとその要素が次々に吐き出される。