高階関数の使い方
pythonでは、関数もオブジェクトの1つにであるため変数として扱うこともできる。
また、関数を他の関数の引数として渡したり、返り値として扱うこともできる。
関数を引数にしたり、返り値にする関数を高階関数と言う。
- 関数を変数のように扱う例
print("hello")
var = print_hello # 変数varに関数をオブジェクトとして代入
var() # このように変数に()を付けると関数が呼び出され、「hello」と表示される
var2 = ['apple', 'orange', print_hello] # 配列の3番目(インデックスだと2)にprint_helloをオブジェクトとして、入れる
var2[2]() #↑配列のインデックス2のprint_helloを呼び出すと、「hello」と表示される
- 引数、返り値に関数を利用する方法
print("{} world".format(msg))
def print_konnichiwa():
print("こんにちは")
def print_hello(func):
func("hello") #引数funcを関数のように利用
return print_konnichiwa # 関数print_konnichiwaを返す
var = print_world # 変数varに関数print_worldを代入
a = print_hello(var)
# 関数print_helloの引数をprint_worldにして、呼び出す
# func("hello")がprint_world("hello")になり、関数内で「"hello world"」と表示
# aに、関数print_konnichiwaを格納
a() # 関数print_konnichiwa()が実行され、"こんにちは"と表示
lambda式の使い方
pythonので1行で終わるような関数を定義する場合に、lambda式を用いることが多い。
lambda式は以下のように記述する。
lambda 引数: 返り値
- lambdaの記述方法
res = a(12) # 引数を12として、無名関数を実行。戻り値は、x * xの144
print(res) # 144
b = lambda x, y, z=5: x * y *z # lambda式で、複数の引数を取り、一部の引数にデフォルト値を入れる
print(b(3,4)) # x=3,y=4として関数が実行され、60と表示
- lambdaで条件式を記述する方法
# x, yを引数として、x < yのときy、それ以外では、xを返す
map関数、sort関数と併用してlambda式を利用する
- map, sortとlambdaを利用する方法
b = map(lambda x: x * x, a) # bには、aをa*aした値、(1,4,9,16)のMapObjectが格納される
c = [("apple", "200yen"), ("grape", "400yen"), ("banana", "100yen"), ("lemon", "50yen")]
c.sort(key=lambda x: x[1]) # cを2番目の値をキーにしてソート
c.sort(key=lambda x: x[0][0] + x[1][0]) # cの1番目の1番目の値+2番目の1番目の値a2,g4,b1,l5で、sort