Python入門【高階関数とデコレータの使い方】

Python デコレータ

こんにちは、ミナトです。

関数は変数のように扱うことができます。引数に関数を渡して処理をする関数または戻り値として関数を返す関数を高階関数と呼びます。

今回はPythonで高階関数を扱う方法と高階関数をシンプルに記述できるデコレータについて解説します。

引数に関数を渡して処理をする関数または戻り値として関数を返す関数を高階関数と言うんや!

今回は高階関数の使い方と高階関数をシンプルに扱えるデコレータについて解説するで😆

以下のような方を対象としています
  • Pythonの高階関数の使い方を知りたい
  • Pythonのデコレータの使い方を知りたい
  • Pythonでプログラミングを学びたい

高階関数

高階関数とは

関数は変数のように扱うことができます。引数に関数を渡して処理をする関数または戻り値として関数を返す関数を高階関数と呼びます。

高階関数の使い方

引数に関数を受け取る高階関数

まずは、引数に関数を受け取る高階関数のコードを確認します。

以下の例では、関数と可変長引数を受け取るexecute()関数を定義しています。
execute()関数を実行するときに引数にadd_num()関数とadd_num()関数の引数に渡す値を渡しています。

execute()関数を実行すると引数に渡されたadd_num()関数が実行されます。
func(*args)の部分がadd_num()関数を実行している箇所です。*argsで可変長引数を展開しています。

このように関数を変数のように関数の引数に渡すことができます。

def add_num(a, b):
    return a + b


# 高階関数
def execute(func, *args):
    return func(*args)


print(execute(add_num, 1, 3))

## 出力
4

戻り値として関数を返す高階関数

続いて、戻り値として関数を返す高階関数の例を確認します。

以下の例では高階関数に渡した関数が実行される直前に引数をログとして出力する高階関数を定義しています。

まず、func1 = log_func(add_num)でinner関数が戻り値として返却されます。

func1(3, 4)でlog_func関数から返却されたinner関数を実行しています。

inner関数では、func(*args)で処理を実行する前に渡された引数*argsをログとして出力しています。

このように、高階関数を利用すると特定の関数に別の機能を付け加えることができます。(今回の例ではadd_num()関数に引数をログ出力する機能が追加されているイメージです。)

def log_func(func):
    def inner(*args):
        print('引数: ', args)
        return func(*args)
    return inner


def add_num(a, b):
    return a + b


func1 = log_func(add_num)
print(func1(3, 4))


## 出力
引数:  (3, 4)
7

デコレータ

デコレータとは

Pythonにおけるデコレータは上記の高階関数をよりシンプルに記述できるようにした機能です。

デコレータの使い方

デコレータを利用する場合、関数定義の前に@高階関数と記述します。
先程の高階関数を例に記述方法を確認してみましょう。

add_num()関数の定義の前に@log_funcをつけることで、上の例と同様にログが出力されることを確認できます。

# 高階関数
def log_func(func):
    def inner(*args):
        print('引数: ', args)
        return func(*args)
    return inner

@log_func
def add_num(a, b):
    return a + b


print(add_num(3, 4))


## 出力
引数:  (3, 4)
7

まとめ

今回はPythonにおける高階関数デコレータの使い方について解説しました。
高階関数は少しややこしいですが、使い方を覚えておくと非常に便利です。

高階関数とデコレータの特徴は以下の通りです。

高階関数とデコレータの特徴
  • 高階関数は引数に関数を渡して処理をする関数または戻り値として関数を返す関数のこと
  • 高階関数を利用すると関数に別の機能付け加えることができる
  • デコレータは高階関数をスマートに扱える記述方法のこと

最後まで読んでいただき、ありがとうございます。

この記事が「面白いな」、「勉強になったな」という方は、SNSでシェアしていただけると嬉しいです。