クロージャーの実装例 Python Javascript Go
本記事ではクロージャーの実装例を紹介します。
実装するもの
クロージャーの実装例としてフィボナッチ数列をとりあげます。フィボナッチ数列とは次のような数列で、
Copied!!0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946
第0項を0、第1項を1としたときに、以降の項が前の2つの項の和となる数列のことです。
Python
Pythonでクロージャーを実装する時のポイントは次の点です
-
nonlocal
を使用すること。使用しなければ変数a
、b
が関数calc
のローカル変数と認識されてしまいます。Copied!!UnboundLocalError: local variable 'a' referenced before assignment
fibonacci.pyCopied!!def fibonacci(): a = 0 b = 1 def calc(): nonlocal a, b ret = a + b a = b b = ret return ret return calc f = fibonacci() for _ in range(20): print(f())
Javascript
- 変数のスコープがpythonより直感的でいいですね。
fibonacci.jsCopied!!fibonacci = () => { var a = 0; var b = 1; calc = () => { ret = a + b; a = b; b = ret; return ret; }; return calc; }; f = fibonacci(); for (let step = 0; step < 20; step++) { console.log(f()); }
Go
fibonacci.goCopied!!package main import "fmt" func fibonacci() func() int { a := 0 b := 1 return func() int { ret := a + b a = b b = ret return ret } } func main(){ f := fibonacci() for i:=0; i<20; i++{ fmt.Println(f()) } }