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)は、スタックからとってくるようにしました。