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つの関数をそれぞれ変数func1とfunc2に格納しました。
そして、関数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はやっぱりコーディングしやすい。
以上