I.何をする?

次を参考にして、Lambda functionsを学びます。

How to Use Python Lambda Functions Python

II.Regular fybctuibsとLambda functionsの形

例えば、食料品の消費税を計算する関数を作成して、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

III.Regular functionsとLambda functionsの違い

それでも、いま一つすっきりしませんので、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>