Pythonで関数の引数に関数を使う方法の解説。そのメリットとは?

Python初心者に向けて、関数の引数に関数を設定する方法とそのメリットの解説・説明

今回のPython初心者向け文法入門解説は、関数の引数に別の関数を設定するという文法についてです。

関数の引数に関数を使うといったい何がどう便利になるのでしょう?今回は、関数の引数に関数を使う方法とそのメリットについて簡単に初歩的な解説をしてみます。

関数の引数に関数を使う方法と構造の解説

方法と具体例

まず関数の引数に関数を使う場合の基本的な書き方のパターンを見てみましょう。次のようになります。

def 関数01:
    処理01
def 関数02:
    処理02
def 関数A(x, y):
    処理A

関数A(関数01, 関数02) ##←関数Aの引数に関数を設定している。今回は2つ。

次に具体例として簡単なコードを書いてみます。

##1
def fnc_hello(s):
    return(s)

##2
def fnc_bye(t):
    return(t)

##3
def fnc_addition(x, y):
    c=x("HELLO")+" and "+y("BYE")
    print(c)

##4
fnc_addition(fnc_hello, fnc_bye) ## HELLO and BYEと表示される

構造と仕組み

このコードの仕組み・解説を簡単に書きます。

まず、##1~##3までは関数の定義・宣言です。そして##4が、関数の引数に別の関数(今回は2つ)を設定し、実行しているものです。

次に、関数fnc_additionの引数として関数fnc_helloと関数fnc_byeが設定されたため、それらの関数がそれぞれ##3における引数のxとyに代入されます。

これにより、##3の

c=x("HELLO")+" and "+y("BYE")

は、実質、

c=fnc_hello("HELLO")+" and "+fnc_bye("BYE")

へと変わります。

そして、fnc_hello(“HELLO”)については、

##1
def fnc_hello(s):
    return(s)

により、その引数sに文字列HELLOが入ります。その後にreturnによって文字列HELLOが、fnc_helloを呼び出した関数fnc_additionへ渡されます。

もう1つの関数fnc_bye(t)についても同様の動きをします。

以上の動きによって、

c=fnc_hello("HELLO")+" and "+fnc_bye("BYE")

は結果として、変数cに、文字列「HELLO and BYE」という情報が代入されます。そしてprint(c)によって、その文字列が表示されます。

関数の引数に関数を使うメリットとは?

関数から別の関数を呼び出す方法の場合

まずは通常よくあると思われる、関数から別の関数を呼び出して使う場合を考えてみましょう。簡単で大雑把すぎる例ですが、次の例を見てください。

#2つの数の足し算
def 関数01(a, b):
#2つの数の引き算
def 関数02(a, b):
#2つの数の掛け算
def 関数03(a, b):
#2つの数の割り算
def 関数04(a, b):

def 関数A(p, q):
    関数01(p, q)
    関数02(p, q)
    関数01の実行結果と関数02の実行結果を使った処理

関数A(g, h)

上の例では仮に4つの関数を宣言したとします。そして、そのうち2つを呼び出して使う別の関数Aを作りました。

これは関数01と02を使ったものですが、それでは、関数03と04を使いたくなった場合はどうしますか?

def 関数A(p, q):

の中を書き換えて

def 関数A(p, q):
    関数03(p)
    関数04(q)
  関数03の実行結果と関数04の実行結果を使った処理

とするのが普通でしょうか。

そうです。def 関数Aの中身を書き換える必要が出てきます。

使う関数を変更するたびにいちいち書き直すのめんどくさくないですか?ということです。(書き換えずに、関数03と関数04を使ってもう1つの関数Bをつくってもいいですが、それも面倒です)

関数の引数に関数を設定する方法の場合

今回の例の場合は使う関数は変わっても、

  • 関数を2つ使うのは同じ
  • 定義した4つの関数のすべてが、「指定された2つの数のを使った計算」という点で同じ

という共通性があります。

ならばそれらの関数そのものを1つの情報としてまとめてしまえばよいのではないか?という考え方になります。

一方、関数の引数として関数を指定した場合の書き方は、 def 関数A以下が次のようになります。

def 関数A(e, f, m, n):
  e(m, n)
    f(m, n)
    関数pの実行結果と関数qの実行結果を使った処理

関数A(関数01, 関数02, 数字1, 数字2)

これは関数01と02を使ったものですが、仮に関数03と関数04をつかいたくなった場合は、

関数A(関数01, 関数02, 数字1, 数字2)

の部分の、

  • 関数01→関数03
  • 関数02→関数04

へと書き換えるだけで済みます。

最後に簡単な具体例をおいておきます。

#足し算
def add(a,b):
    return a+b
#引き算
def subtr(a,b):
    return a-b
#掛け算
def multi(a,b):
    return a*b
#割り算
def div(a,b):
    return a/b

##関数から関数を呼び出す方法を使った場合##
def fnc_01(p,q):
    h=add(p,q)
    j=subtr(p,q)
    print(h+j)

fnc_01(10,5)

##関数の引数に関数を指定する方法を使った場合##
def fnc_02(e, f, m, n):
    print(e(m, n)+f(m, n))

fnc_02(add, subtr, 10,5)

関数を引数として指定する方法のメリット

このように、 関数の引数に関数を設定する方法のメリットは、 似た処理の関数が複数ある場合に、

  • 「呼び出す側の関数」を書き換えたり、変更したりする手間を減らせること
  • コードの記述量も減せる

といったような効率化・合理化だと言えるでしょうか。

もしみなさんがこれからのプログラミング学習や転職などに悩みがあるならば、現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのも良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。

Webマーケティングコース

Webアプリケーションコース

データサイエンスコース

機械学習の基礎が学べる「Pythonコース」

など各種の講座が用意されていますので、自分の未来に沿った講座が見つかります。無料で体験できるテックアカデミー無料体験も用意されていますのでお得に利用してみてください。

初心者におすすめプログラミングスクール