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))
最初のaddOneで3が4になり、次のaddOneで5になります。関数を引数として渡すことで、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回重ねます。10に1が3回足され、13が表示されます。