Pythonistaで自分専用RPN電卓を作る(04)

lambda関数を使って重複する処理をまとめる

pythonは関数を変数に代入することができます。

def add(x, y):
    return x+y

a = add

a(1, 2)

とすれば、

>>> 3

が得られます。これでも関数を変数に代入できますが、いちいち関数の定義が必要で、コードが長くなります。

a = lambda x, y : x+y
a(1,2)

>>>3

このようにlambda関数を使えば、より短く実現できます。

lambda関数をつかって処理をまとめたRPN電卓のコア部分は以下のようになります。

class RPN():
    _stack = []

    def push(val):
        RPN._stack.append(val)

    def pop():
        return RPN._stack.pop()

    def _calc(op):
        y = RPN._stack.pop()
        x = RPN._stack.pop()
        z = op(x, y)
        RPN._stack.append(z)
        return

    def add():
        RPN._calc(lambda x, y: x+y)
        return

    def sub():
        RPN._calc(lambda x, y: x-y)
        return

    def mul():
        RPN._calc(lambda x, y: x*y)
        return

    def div():
        RPN._calc(lambda x, y: x/y)
        return

前回のコードでは、例えば'a+b'を計算する際、aはスタックの一番上からとってきて、bは関数の引数として与えていました。 今回、_calc()を設計する際、引数に性質の異なるものを混在させるのが嫌だったので、引数としてはlambda関数だけ渡し、演算する値(a+bのうち、aとb)は、スタックからとってくるようにしました。