外でも結構されてる説明
を、もう少しわかりやすい命名にしたつもりです。
def k_minus_x(k):
# もととなる関数。こいつが高階関数。
def f(x):
return k - x
return f
five_minus_x = k_minus_x(5) # x_minus_3は新しい関数と捉えてOK
print(five_minus_x(3)) # 2
print(k_minus_x(7)(3)) # 4
真価は場合分けのときなのでは?
試しに書いたのは、じゃんけんするだけのコード。
関数の中で関数を宣言しなくても使えるみたい。
当然もっとシンプルにできるけど、複雑な処理をさせたいときは結構使えそう。
def janken(hand: str):
# もととなる関数。こいつが高階関数。
if(hand == 'rock'):
return print_paper
elif(hand == 'paper'):
return print_scissors
elif(hand == 'scissors'):
return print_rock
def print_rock():
print('rock')
def print_paper():
print('paper')
def print_scissors():
print('scissors')
print('パターン1。返ってきた関数をそのまま実行する')
janken("rock")() # paper
janken("paper")() # scissors
janken("scissors")() # rock
print('パターン2。一旦新しい関数として保存してから実行する')
show_enemy_hand_against_rock = janken("rock")
show_enemy_hand_against_rock() # paper
show_enemy_hand_against_paper = janken("paper")
show_enemy_hand_against_paper() # scissors
show_enemy_hand_against_scissors = janken("scissors")
show_enemy_hand_against_scissors() # rock
パターン1。返ってきた関数をそのまま実行する
paper
scissors
rock
パターン2。一旦新しい関数として保存してから実行する
paper
scissors
rock
でも毎回このレベルのわけ方してたらだるいなぁ。。。今回のケースなら、returnせずに直接printしちゃう