Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのファーストクラス関数(第一級関数)とは?基本と使い方を解説

多くのプログラミング言語において、「ファーストクラスオブジェクト(第一級オブジェクト)」とは、統一的な方法で扱うことのできるオブジェクトを指します。ファーストクラスオブジェクトは、データ構造として格納したり、他の関数の引数として渡したり、制御構造の中で利用したりできます。

Pythonでは関数もこのようなオブジェクトとして扱われ、ファーストクラスオブジェクトのすべての性質を満たす場合、その関数はファーストクラス関数(第一級関数)であると言えます。

ファーストクラス関数の主な性質

  • Object型のインスタンスである
  • 変数として代入・保存できる
  • 他の関数の引数として渡せる
  • 関数の戻り値として別の関数を返せる
  • リストやセットなどのデータ構造に格納できる

それでは、Pythonの関数がどのようにオブジェクトとして扱えるのか、順番に見ていきましょう。

1. 関数を変数に代入する

Pythonでは、関数をそのまま変数に代入できます。このとき関数は呼び出されないため、括弧 () は付けません。

def cube(x):
    return x * x * x

res = cube(5)
print(res)

my_cube = cube  # my_cube は cube 関数と同一のオブジェクト
res = my_cube(5)
print(res)

実行結果

125
125

cube を代入した my_cube は、元の関数とまったく同じように呼び出せることがわかります。

2. 関数を引数として渡す

次に、関数を別の関数の引数として渡す例を見てみましょう。リストの各要素に対して、引数で受け取った関数を適用する汎用関数を作成しています。

def cube(x):
    return x * x * x

def my_map(method, argument_list):
    result = list()
    for item in argument_list:
        result.append(method(item))
    return result

my_list = my_map(cube, [1, 2, 3, 4, 5, 6, 7, 8])  # 関数を引数として渡す
print(my_list)

実行結果

[1, 8, 27, 64, 125, 216, 343, 512]

このように、処理内容を表す関数を引数として自由に差し替えられるため、柔軟で再利用性の高いコードを書けます。組み込みの map() 関数も同様の仕組みで動作しています。

3. 関数から別の関数を返す

3つ目の性質は、関数の戻り値として別の関数を返せることです。以下の例では、メッセージを受け取ってロギング用の関数を生成する関数を作成しています。

def create_logger(message):
    def log():
        print('Log Message: ' + message)
    return log  # 関数を返す

my_logger = create_logger('Hello World')
my_logger()

実行結果

Log Message: Hello World

ここで注目したいのは、create_logger の実行が終わった後でも、内側の log 関数が引数 message の値を覚えている点です。これはクロージャ(closure)と呼ばれる仕組みで、関数を返すパターンと組み合わせると非常に強力になります。

まとめ

Pythonの関数はオブジェクトであり、変数への代入、引数としての受け渡し、戻り値としての返却、データ構造への格納など、あらゆる操作が可能です。これらの性質を活かすことで、デコレータや高階関数など、Pythonらしい柔軟なプログラミングスタイルを実現できます。

  1. Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説

    本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値

  2. Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法

    この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print