牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

『ハッカーと画家』第13章 オタク野郎の復習 付録:力 のアキュムレータのとこクロージャの件のメモ

Ruby

def foo(n)
  lambda { |i| n += i }
end

f = foo(1)
puts f.call(1)
puts f.call(2)
puts f.call(3)
puts f.call(4)
puts f.call(5)

#=> 2
#=> 4
#=> 7
#=> 11
#=> 16
#=> nil

Python

Python の lambda は式しか使えない。代入は文なので下記はエラーになる。

def foo(n):
    lambda i: n += i
# SyntaxError: invalid syntax

だからPythonで書くと多少冗長になる。

def foo(n):
    s = [n]
    def bar(i):
        s[0] += i
        return s[0]
    return bar

f = foo(1)
print f.__call__(1)
print f.__call__(2)
print f.__call__(3)
print f.__call__(4)
print f.__call__(5)

#=> 2
#=> 4
#=> 7
#=> 11
#=> 16