結論から先に書くと
print("")を2回実行させたいような場合を除いて、lambda式で複数行を実行させようと考えるのではなく、コールバック関数を使って実装した方がバグを発生させずにコーディングできると思いました。以下、その考察過程です。
コールバック関数を使った場合
・コールバック関数なので、コールバック関数内で複数行を実行するのは問題ない。
# コールバック関数
def call_back():
print("aaaa")
print("bbbb")
# 高階関数
def higher_order(func):
return func()
higher_order(call_back)
# 実行結果
# aaaa
# bbbb
上のコードをlambda式を使って書き換えた場合
・配列にすると上手くいきました。lambda式は「文ではなくて式」なので、複数行は基本的にはできませんが、戻り値を配列にすると、複数行の実行が可能になるようです。但し、難しい処理はしないで、print("")のように簡単な処理に限定して利用した方がよいと思われます。
# 高階関数
def higher_order(func):
return func()
higher_order(lambda: [print("aaaa"), print("bbbb")])
# 実行結果
# aaaa
# bbbb
コールバック関数に引数を付けて考えてみる
# コールバック関数
def call_back(a, b):
a += 1
b = a + b + 100
return a, b
# 高階関数
def higher_order(func, a, b):
return func(a, b)
aa = 1
bb = 10
(aa, bb) = higher_order(call_back, aa, bb)
print("aa = " + str(aa))
print("bb = " + str(bb))
# 実行結果
# aa = 2
# bb = 112
上のコードをlambda式で置き換えた場合
# 高階関数
def higher_order(func, a, b):
return func(a, b)
aa = 1
bb = 10
(aa, bb) = higher_order(lambda x, y: [x + 1, y + x + 100], aa, bb)
print("aa = " + str(aa))
print("bb = " + str(bb))
# 実行結果
# aa = 2
# bb = 111
bbが112と111で違いが発生しています。このような違いはバグになってしまうと思われるので、lambda式で複数行を実行するというようなチャレンジは行わないで、コールバック関数でしっかり実装した方が良いと思いました。
ベテランになるとまた違う考えがあるのかもしれませんが、今の自分の知識ではこのような結論に至りました。