Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

イテレータ

イテレータとは:
 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]