0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

40代おっさんPythonを勉強する(イテレータandジェネレータ編)

Posted at

本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

イテレータ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)

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?