15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonのlambda式で複数行を実行させたいので実験した

Last updated at Posted at 2019-11-29

結論から先に書くと

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式で複数行を実行するというようなチャレンジは行わないで、コールバック関数でしっかり実装した方が良いと思いました。
ベテランになるとまた違う考えがあるのかもしれませんが、今の自分の知識ではこのような結論に至りました。

15
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?