イテレータ
イテレータとは:
1. シーケンスなどの要素を次々取り出す。→ __next__
2. 終わったら知らせる。 → StopIteration
forループや内包表記では内部でiter()関数が呼ばれ、
順に「__next__」をしていき、最後にStopIterationで停止するので、
__next__やStopIterationを気にせず使える。
「遅延評価」:
イテレータオブジェクト生成時には要素は生成せず、
必要になったときに要素を生成していく。
→省メモリかつ高速化
ただしmax()やsum()などと一緒に使うと全要素を生成することになるので、イテレータの特長はあまり活かされない。
i = iter([1, 2, 3]) print(next(i)) # 1 print(next(i)) # 2 print(next(i)) # 3 print(next(i)) # StopIteration
イテレート可能なオブジェクト
・リスト
・タプル
・辞書dict
・dict.valuesオブジェクト
・dict.itemsオブジェクト
・集合set
・zipオブジェクト
・enummerateオブジェクト
・mapオブジェクト
・filterオブジェクト
・rangeオブジェクト
・文字列型
・bytes型
・reversedオブジェクト
・ファイルオブジェクト(要素は各行)
・generatorオブジェクト
・numpy.ndarrayオブジェクト
文字列型の例
for i in "あおによし": print(i) # あ # お # に # よ # し
ファイルオブジェクトの例
# テキストファイルの最初の5行を表示 print("".join([line for n, line in enumerate( open("data/test1.txt", encoding="utf-8")) if n < 5]))
集合型の例
for i in {1, 3, 5, 7, 9}: print(i) # 1 # 3 # 5 # 9 # 7
集合型では要素を取り出す順番が保障されていない。
mapオブジェクトの例
m = map(lambda x:x*0.1,[1, 3, 5, 7, 9]) print(m) # <map object at 0x...> for i in m: print(i) # 0.1 # 0.30000000000000004 # 0.5 # 0.7000000000000001 # 0.9
dict.items()オブジェクトの例
dic1 = {"睦月":"1月", "如月":"2月", "弥生":"3月"} dic2 = {v:k for k, v in dic1.items()} print(dic1) # {'如月': '2月', '睦月': '1月', '弥生': '3月'} print(dic2) # {'1月': '睦月', '2月': '如月', '3月': '弥生'}
numpy.ndarrayの例
import numpy as np a1 = np.arange(15).reshape(3, 5) order = {0:"1st", 1:"2nd", 2:"3rd"} for i, row in enumerate(a1): print(order[i], "row", row) # 1st row [0 1 2 3 4] # 2nd row [5 6 7 8 9] # 3rd row [10 11 12 13 14]