22 / 2781%

LESSON 22 ・ 関数

高階関数

関数を引数に渡す

def square(x):
    return x * x

a = twice(square, 3)
print(a)

関数の引数に関数を渡すこともできます。

たとえば、同じ関数を2回繰り返して実行する関数twiceを考えます。そうすると、twiceに繰り返したい関数squareを渡したくなるはずです。これが、関数に関数を渡すという意味です。

上記の例では、まずsquare(3)3 * 3が実行されて9が得られ、さらにsquare(9)9 * 9が実行されて81が得られます。

このように、関数を引数として受け取る、または関数を戻り値として返す関数を高階関数(こうかいかんすう, higher-order function)と言います。

高階関数を実装する

def twice(f, x):
    y = f(x)
    z = f(y)
    return z

def square(x):
    return x * x

a = twice(square, 3)
print(a)

関数twiceはこのように実装できます。

def twice(f, x):
    return f(f(x))

def square(x):
    return x * x

a = twice(square, 3)
print(a)

より簡潔に書くこともできます。

PRACTICE

演習問題

コードを自分で書いて実行してから、答えと解説を確認しましょう。

問題1

受け取った関数を2回適用する高階関数twiceと、整数を2乗する関数squareを定義してください。twice(square, 3)の結果を表示してください。

答えと解説を見る

模範解答

def twice(f, x):
    return f(f(x))

def square(x):
    return x * x

print(twice(square, 3))

twiceは関数fを引数として受け取り、その関数を2回呼び出します。3を2乗した9がもう一度2乗されるため、81が表示されます。

問題2

受け取った整数を1増やす関数addOneと、受け取った関数を2回適用する高階関数twiceを定義してください。twice(addOne, 3)の結果を表示してください。

答えと解説を見る

模範解答

def twice(f, x):
    return f(f(x))

def addOne(x):
    return x + 1

print(twice(addOne, 3))

最初のaddOne34になり、次のaddOne5になります。関数を引数として渡すことで、twiceは異なる関数にも使えます。

問題3

受け取った関数を3回適用する高階関数thriceを定義してください。addOneを渡して、thrice(addOne, 10)の結果を表示してください。

答えと解説を見る

模範解答

def thrice(f, x):
    return f(f(f(x)))

def addOne(x):
    return x + 1

print(thrice(addOne, 10))

fの戻り値を次のfへ渡す処理を3回重ねます。101が3回足され、13が表示されます。