関数オブジェクト

関数オブジェクト

関数オブジェクト

 Python で関数を使用するときは、関数名(引数) と記述します。コードを実行すると、その関数の機能に応じて様々なクラスのオブジェクトが返ります。たとえば、オブジェクトの長さを返す組み込み関数 len() に "Python" という文字列を渡すと「6」という intクラスのオブジェクトが返ります。

x = len("Python")

print(x)
print(type(x))
6
<class 'int'>

 今度は () を添えずに len という関数名だけを変数 x に渡して、print(x) で表示させてみます。

x = len

print(x)
print(type(x))
<built-in function len>
<class 'builtin_function_or_method'>

 変数 x は関数オブジェクト (builtin_function_or_method クラスのインスタンス)を参照していることがわかります。x() にオブジェクトを渡すと、そのオブジェクトは参照先の len() に渡され、オブジェクトの長さを返します。

# xに関数lenを格納
x = len

# 関数xに文字列を渡す
y = x("Python")

print(y)
6

 Python ではすべてがオブジェクトです。もちろん関数もオブジェクトです。
 関数をオブジェクトであることを明示するために、関数のことを敢えて 関数オブジェクト とよぶことがあります。関数型プログラミングでは関数オブジェクトの受け渡しがコードの核となります。
 

関数のリスト

 Python のリストはほとんどあらゆるオブジェクトを格納できます。もちろん、関数オブジェクトを要素にもつこともできます。それほど頻繁に使うわけではありませんが、複数の関数をリストにまとめておくと便利なこともあります。まずは簡単な例を見てみましょう。

import math

# 関数リスト
func_list = [math.sqrt, math.exp, math.cos]

# √10, exp(10), cos(10)を計算
for f in func_list:
    print(f(10.0))
3.1622776601683795
22026.465794806718
-0.8390715290764524

 このコードのループ処理では最初にループ変数 f に関数オブジェクト math.sqrt を入れてます。そして関数 f に 10.0 を渡して平方根を表示します。次に f に math.exp を入れて、10.0 を渡してexp(10.0) を表示します。最後に f に math.cos を入れて、10.0 を渡して cos(10.0) を表示させています。

 次のサンプルは、あるオブジェクトを float() に渡し、その戻り値を int() に渡し、その戻り値を str() に渡すというコードです。

# 関数のリスト
func_list = [float, int, str]

x = "10.5"

for k in range(3):
    x = func_list[k](x)

print(x)
10

 最終的に「10」という文字列 (strクラスのオブジェクト) が返ります。ループ処理のブロックに記述されている

x = func_list[k](x)

という部分では、func_list のインデックス k の要素に x を渡し、その戻り値を x に入れるという再帰的な処理が行われています。