牌語備忘録 -pygo

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

牌語備忘録 -pygo

クロージャが何んだか解らないのでPythonでやってみた

訂正:コードがクロージャではなかったので書き直してみた

クロージャは、プログラミング言語において引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する関数のことである。関数とそれを評価する環境のペアであるともいえる

クロージャ - Wikipedia

う〜んよくわからん(´・ω・`)

例(javascript

function newCounter() {
var i = 0;
return function() { // 無名関数
i = i + 1;
return i;
}
}

c1 = newCounter();
alert(c1()); // 1
alert(c1()); // 2
alert(c1()); // 3
alert(c1()); // 4
alert(c1()); // 5

クロージャ - Wikipedia
Python

Pythonでのクロージャについて(追記あり) - NAL-6295の舌先三寸』さんを参考にPythonでやってみた

def newCounter():
    def f():
        f.value += 1
        return  f.value
    f.value = 0
    return f
c1 = newCounter()
print c1()    #1
print c1()    #2
print c1()    #3
print c1()    #4
print c1()    #5

こんな感じ?

コード書き直してみた

コメント頂いたmorchinさんにご指摘ご指導うけたのでやり直してみた

その1

i = [0]
def f():
    i.append(1)
    return sum(i)
print f()    #1
print f()    #2
print f()    #3
print f()    #4
print f()    #5

その2

def neo_counter():
    i = [0]
    def f():
        i.append(1)
        return sum(i)
    return f
c1 = neo_counter()
print c1()    #1
print c1()    #2
print c1()    #3
print c1()    #4
print c1()    #5

こんなんでどうでしょう?