本記事について
この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。
イテレータandジェネレータ編
- 他のプログラミング言語では大体ループを使ってシーケンスデータを処理する
names = ['としき', 'アッキー', '三郎']
i = 0
total = len(names)
while i < total:
print(names[i])
i += 1
- イテラブルオブジェクトとしてforで処理すると1つずつの要素を取り出せる
names = ['としき', 'アッキー', '三郎']
for n in names:
print(n)
- 基本のイテラブルオブジェクト:文字列、リスト、タプル、辞書、しゅうごうなど
ジェネレータ
- ジェネレータとは、シーケンスを作成するオブジェクトで、イテレータのソースデータになることが多い
- 今まで使っていたrange(start, end, step)関数はジェネレータの1つ
print(list(range(10))) # start=0, end=10, step=1
print(list(range(10, 15))) # start=10, end=15, step=1
print(list(range(0, 50, 5))) # start=0, end=50, step=5
print(list(range(5, -5, -1))) # start=0, end=50, step=5
- ジェネレータは反復処理のために、最後に呼び出されたときを記憶し、次の値を返す
- ジェネレータ関数では値をreturで返す代わりにyieldで返す
- yieldは、関数を一時的に実行停止させることが出来る機能を持つ文
- 一度に一つの値しか生成しないので、メモリの消費量を抑えることが出来る
2つの関数を比べる
def my_range(first=97, last=123, step=1): # returnを使う例
char = first
charlist = []
while char < last:
charlist.append(chr(char))
char += step
return charlist # こちらに全てをためたものが帰っているのでメモリを使う
for c in my_range(): # 一度26バイトのメモリを使う
print(c)
def my_range(first=97, last=123, step=1): # yieldを使う例
char = first
while char < last:
yield chr(char) # こちらで一旦停止して、値を返す
char += step
for c in my_range(): # 一度1バイトのメモリを使う
print(c)
参考