2018年12月02日
クロージャとは【Python】
■クロージャの前に、関数内関数を知っておく
■いよいよクロージャ!
■まとめ
ただいまPythonを勉強中です。
それで突き当たったのがクロージャ。
私の買った本には載ってない・・・!
あまりつかわない機能なのでしょうか?
とはいえ、JavaScriptやJava8,Swiftなどにもクロージャの機能があるので
ざっくりと学習したいと思います。
■クロージャの前に、関数内関数を知っておく
クロージャを理解する前に必要な知識は、関数内関数です。
この結果は 13 となります。
まずはこのように、関数内に関数を定義できることと、
funcで与えられる変数aはinner関数でも参照できることを
理解しておく必要があります。
■いよいよクロージャ!
クロージャの形は以下のようになります。
まず、上の例でinner(3)としていたところがreturn innerに変わりました。
ここではbに入るはずの具体的な3という数字は入れず、
inner関数自体をfunc()の戻り値として返しています。
(C言語での、関数ポインタのようなイメージですね)
次に、outer_func(10)として関数をよぶことで、
10を入れた状態のinner_func関数がfunc1に返り、
outer_func(15)として関数をよぶことで、
15を入れた状態のinner_func関数がfunc2に返ります。
つまりは、以下のような2つの関数を作ったことになります。
要するに、数値だけが異なり、処理が同じ複数の関数を一度に定義できる機能です。
引数の数を増やして、1つの関数にしてしまえといえばそれで解決なのですが
あらかじめパラメータを設定済みにした関数を作るのが、クロージャなのです。
■まとめ
クロージャとは
パラメタは異なるが、処理が同じ関数を一度に作成できる。
関数内にパラメタを設定済にできる(パラメタを保持できる)。
使わなくてもなんとかなりそうだけど便利かも。
■いよいよクロージャ!
■まとめ
ただいまPythonを勉強中です。
それで突き当たったのがクロージャ。
私の買った本には載ってない・・・!
あまりつかわない機能なのでしょうか?
とはいえ、JavaScriptやJava8,Swiftなどにもクロージャの機能があるので
ざっくりと学習したいと思います。
■クロージャの前に、関数内関数を知っておく
クロージャを理解する前に必要な知識は、関数内関数です。
def outer_func(a):
def inner_func(b):
print(a + b)
inner_func(3)
outer_func(10)
def inner_func(b):
print(a + b)
inner_func(3)
outer_func(10)
この結果は 13 となります。
まずはこのように、関数内に関数を定義できることと、
funcで与えられる変数aはinner関数でも参照できることを
理解しておく必要があります。
■いよいよクロージャ!
クロージャの形は以下のようになります。
def outer_func(a):
def inner_func(b):
print(a + b)
return inner_func
func1 = outer_func(10)
func2 = outer_func(15)
def inner_func(b):
print(a + b)
return inner_func
func1 = outer_func(10)
func2 = outer_func(15)
まず、上の例でinner(3)としていたところがreturn innerに変わりました。
ここではbに入るはずの具体的な3という数字は入れず、
inner関数自体をfunc()の戻り値として返しています。
(C言語での、関数ポインタのようなイメージですね)
次に、outer_func(10)として関数をよぶことで、
10を入れた状態のinner_func関数がfunc1に返り、
outer_func(15)として関数をよぶことで、
15を入れた状態のinner_func関数がfunc2に返ります。
つまりは、以下のような2つの関数を作ったことになります。
def func1(b):
print(10 + b)
def func2(b):
print(15 + b)
print(10 + b)
def func2(b):
print(15 + b)
要するに、数値だけが異なり、処理が同じ複数の関数を一度に定義できる機能です。
引数の数を増やして、1つの関数にしてしまえといえばそれで解決なのですが
あらかじめパラメータを設定済みにした関数を作るのが、クロージャなのです。
■まとめ
クロージャとは
パラメタは異なるが、処理が同じ関数を一度に作成できる。
関数内にパラメタを設定済にできる(パラメタを保持できる)。
使わなくてもなんとかなりそうだけど便利かも。
この記事へのトラックバックURL
https://fanblogs.jp/tb/8350472
※言及リンクのないトラックバックは受信されません。
この記事へのトラックバック