投稿

[今さら始める Python マスター #10] デコレータとジェネレータ

Pythonのデコレータとジェネレータを使って、処理の共通化とメモリ効率のよい反復処理を学びます。

[今さら始める Python マスター #10] デコレータとジェネレータ

デコレータとは

デコレータは、関数の前後に共通処理を追加する仕組みです。

1
2
3
4
5
6
7
8
9
10
11
def log_call(func):
    def wrapper(*args, **kwargs):
        print("start")
        result = func(*args, **kwargs)
        print("end")
        return result
    return wrapper

@log_call
def greet():
    print("hello")

ログ、認証、計測などでよく使われます。

ジェネレータとは

ジェネレータは、値を一つずつ返す反復処理です。大量データを一度にメモリへ載せたくないときに便利です。

1
2
3
def count_up():
    for i in range(3):
        yield i

yield

二つの例とも、定義しただけでは結果を表示しません。greet()を呼ぶとstart → hello → endの順に表示されます。count_up()は生成したジェネレータをfor文などで取り出すと0、1、2を順に返し、最後まで使った同じジェネレータをもう一度回しても値は出ません。呼び出しと反復で、どの時点に処理が動くかを比べてみましょう。

yieldは値を返しつつ、関数の状態を保持します。次に呼ばれたとき、続きから実行されます。

今日のゴール

デコレータは処理の共通化、ジェネレータは効率的な反復処理に役立ちます。最初は小さな例で動きを確認しましょう。

この投稿は投稿者によって CC BY 4.0 の下でライセンスされています。