例えば、食料品の消費税を計算する関数を作成して、100円の商品の税を算出するスクリプは次です。
def myfunc(x):
return x*0.08
myfunc(100)
## 8.0
Lambda関数を使うと次のように書けます。
mylambda = lambda x: x*0.08
mylambda(100)
## 8.0
Lambda関数は名前のない(anonymous)点で、ふつうの関数と区別されるといわれますが、この例だとわかりにくいです。
次のようにすれば少しわかりやすくなります。
(lambda x: x*0.08)(100)
## 8.0
それでも、いま一つすっきりしませんので、Pythonのbytecodeでどのような違いがあるかを調べます。ライブラリdisを用います。
ふつうの関数の場合は次です。
import dis
def myfunc(x):
return x*0.08
print(type(myfunc))
## <class 'function'>
print(dis.dis(myfunc))
## 2 0 LOAD_FAST 0 (x)
## 2 LOAD_CONST 1 (0.08)
## 4 BINARY_MULTIPLY
## 6 RETURN_VALUE
## None
print(myfunc)
## <function myfunc at 0x7f977b630950>
Lambda関数の場合は次です。
import dis
(lambda x: x*0.08)
## <function <lambda> at 0x7f977b630cb0>
print(type(lambda x: x*0.08))
## <class 'function'>
print(dis.dis(lambda x: x*0.08))
## 1 0 LOAD_FAST 0 (x)
## 2 LOAD_CONST 1 (0.08)
## 4 BINARY_MULTIPLY
## 6 RETURN_VALUE
## None
print(lambda x: x*0.08)
## <function <lambda> at 0x7f977b6310e0>
異なっているのは、それぞれの最後の行だけです。Lambda関数は名前がないのでlambdaとなります。
Lambda関数にmylambdaという名前をつけてみます。
import dis
mylambda = lambda x: x*0.08
print(type(mylambda))
## <class 'function'>
print(dis.dis(mylambda))
## 1 0 LOAD_FAST 0 (x)
## 2 LOAD_CONST 1 (0.08)
## 4 BINARY_MULTIPLY
## 6 RETURN_VALUE
## None
print(mylambda)
## <function <lambda> at 0x7f979111b680>
名前をつけると次のようにふつうの関数のようにつかえますが、関数の名はlambdaです。
import dis
print(mylambda(200))
## 16.0
print(mylambda)
## <function <lambda> at 0x7f979111b680>