LoginSignup
0
2

More than 3 years have passed since last update.

【Python】関数を変数に格納して扱う方法(備忘録)

Last updated at Posted at 2021-04-02

Pythonをまた好きになったのでメモ。

はじめに

2017年にC#7からローカル関数という機能が出てきてC#エンジニアを喜ばせました。
関数を変数化することで、ラムダ式では難しい再帰呼び出しが出来たり、引数の既定値を与えたりが出来ます。
C#すげー!イケてるー!と思っていたらPythonでも普通に「関数を変数に格納して扱う」ということが出来るとわかりました。

Pythonエンジニアには当たり前すぎる話かもしれませんが簡単に説明します。

事前準備

まずは2つの関数を準備します。
add_one_hundred()はプラス100をする関数
add_two_hundred()はプラス200をする関数
2つの関数は共に数値型の引数を受け取って、特定の数値を加算して返却するというものです。

def add_one_hundred(value):
    return value + 100

def add_two_hundred(value):
    return value + 200

print(add_one_hundred(1))
print(add_two_hundred(1))

同じ引数「1」を与えて以下のような結果となります。

101
201

関数を引数として受け取れる関数を準備

次に以下の関数を用意します。
func_add_value()は引数「func」を数値1を引数に実行し、引数「value」を加算する関数
ここでポイントになるのが、関数の引数を関数として使っていることです。

def func_add_value(func, value):
    return func(1) + value

関数を変数に格納して扱う

では実際に使用してみます。

def add_one_hundred(value):
    return value + 100

def add_two_hundred(value):
    return value + 200

def func_add_value(func, value):
    return func(1) + value

func1 = add_one_hundred
func2 = add_two_hundred
print(func_add_value(func1, 1000))
print(func_add_value(func2, 1000))

2つの関数をそれぞれ変数func1func2に格納しました。
そして、関数func_add_value()に第一引数としてそれぞれの関数を格納した変数、第二引数として同一の数値「1000」を渡しています。
すると出力結果は以下のようになります。
add_one_hundred()add_two_hundred()の関数の結果の違いで最終的な出力結果が変わっています。

1101
1201

もちろん変数に格納せずに直接引数に渡すことも出来ます。

def add_one_hundred(value):
    return value + 100

def add_two_hundred(value):
    return value + 200

def func_add_value(func, value):
    return func(1) + value

print(func_add_value(add_one_hundred, 1000))
print(func_add_value(add_two_hundred, 1000))
1101
1201

こんなことも出来る

今回定義した関数func_add_value()「引数も戻り値も数値」という条件の関数であれば内部の処理が違っても受け付けます。
なので以下のような関数内の処理がバラバラでも正常に処理が行えます。

def add_one_hundred(value):
    return value + 100

def get_pi(value):
    return 3.14159265358979323846264338327950288

def sum_value(value):
    if value < 1:
        return value
    return value + sum_value(value-1)

def func_add_value(func, value):
    return func(1) + value

print(func_add_value(add_one_hundred, 1000))
print(func_add_value(get_pi, 1000))
print(func_add_value(sum_value, 1000))
print(func_add_value(abs, 1000))
1101
1003.1415926535898
1001
1001

※急に出てきて何それと思うかもしれませんがprint(func_add_value(abs, 1000))で引数として渡している関数「abs()」は数値の絶対値を返却するPythonの組み込み関数です。

別クラスの関数にも同じように関数を渡すことが出来るので、使い方は無限大です。
↓の記事で実際に別クラスの関数に関数を引数として渡す実装をしています。

Pythonはやっぱりコーディングしやすい。

以上

0
2
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
2