「Pythonの基礎 - クロージャ」の版間の差分
(ページの作成:「== 概要 == Pythonには、クロージャというものが存在する。<br> <br> クロージャとは、参照環境を伴ったような関数、あるいはその…」) |
細 (文字列「</source>」を「</syntaxhighlight>」に置換) |
||
(同じ利用者による、間の2版が非表示) | |||
8行目: | 8行目: | ||
== クロージャを理解する == | == クロージャを理解する == | ||
まず、クロージャを理解するために、関数内関数を見ておく。<br> | まず、クロージャを理解するために、関数内関数を見ておく。<br> | ||
< | <syntaxhighlight lang="python"> | ||
def OuterFunc(a, b): | def OuterFunc(a, b): | ||
def InnerFunc(): | def InnerFunc(): | ||
19行目: | 19行目: | ||
# 出力 | # 出力 | ||
5 | 5 | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
クロージャは、上記のサンプルコードを次のように変更する。<br> | クロージャは、上記のサンプルコードを次のように変更する。<br> | ||
27行目: | 27行目: | ||
これは、まだInnerFunc関数が実行されていない状態である。<br> | これは、まだInnerFunc関数が実行されていない状態である。<br> | ||
この状態を記憶して、後で使用することができるものがクロージャである。ここでは、InnerFuncがクロージャになる。<br> | この状態を記憶して、後で使用することができるものがクロージャである。ここでは、InnerFuncがクロージャになる。<br> | ||
< | <syntaxhighlight lang="python"> | ||
def OuterFunc(a, b): | def OuterFunc(a, b): | ||
def InnerFunc(): | def InnerFunc(): | ||
38行目: | 38行目: | ||
# 出力 | # 出力 | ||
<function outer_function.<locals>.inner_function at 0x10d86b7b8> | <function outer_function.<locals>.inner_function at 0x10d86b7b8> | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
44行目: | 44行目: | ||
クロージャを実行するには、次のように行う。<br> | クロージャを実行するには、次のように行う。<br> | ||
以下の例では、OuterFunc関数をfuncオブジェクトに代入している。これに、丸括弧()を付けてfuncオブジェクトを実行している。<br> | 以下の例では、OuterFunc関数をfuncオブジェクトに代入している。これに、丸括弧()を付けてfuncオブジェクトを実行している。<br> | ||
< | <syntaxhighlight lang="python"> | ||
def OuterFunc(a, b): | def OuterFunc(a, b): | ||
def InnerFunc(): | def InnerFunc(): | ||
55行目: | 55行目: | ||
# 出力 | # 出力 | ||
5 | 5 | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
次に、長方形の面積を計算するサンプルコードを記述する。(横(width)と縦(height)を乗算)<br> | 次に、長方形の面積を計算するサンプルコードを記述する。(横(width)と縦(height)を乗算)<br> | ||
63行目: | 63行目: | ||
まず、2種類の横の数値を与えた後、オブジェクト変数ac1とac2にAreaCalcFuncオブジェクトを代入している。<br> | まず、2種類の横の数値を与えた後、オブジェクト変数ac1とac2にAreaCalcFuncオブジェクトを代入している。<br> | ||
このオブジェクト変数ac1とac2に丸括弧()を付けて縦の数値を与えることで計算が実行される。<br> | このオブジェクト変数ac1とac2に丸括弧()を付けて縦の数値を与えることで計算が実行される。<br> | ||
< | <syntaxhighlight lang="python"> | ||
def AreaCalc(width): | def AreaCalc(width): | ||
def AreaCalcFunc(height): | def AreaCalcFunc(height): | ||
81行目: | 81行目: | ||
250 | 250 | ||
500 | 500 | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Python]] | [[カテゴリ:Python]] |
2021年11月24日 (水) 18:08時点における最新版
概要
Pythonには、クロージャというものが存在する。
クロージャとは、参照環境を伴ったような関数、あるいはその関数への参照のことを指す。(関数内関数やC/C++/C#の関数オブジェクトに似ている)
関数内の変数を扱う時、その関数が宣言された時のもの(スコープ)によって実行されるというような説明もできる。
クロージャを理解する
まず、クロージャを理解するために、関数内関数を見ておく。
def OuterFunc(a, b):
def InnerFunc():
return a + b
return InnerFunc()
print(OuterFunc(2, 3))
# 出力
5
クロージャは、上記のサンプルコードを次のように変更する。
以下の例では、OuterFunc関数の戻り値が、InnerFunc関数を呼び出すのではなく、丸括弧を使用せずにInnerFuncオブジェクトを記述している。
このサンプルコードを実行すると、InnerFuncオブジェクトのアドレスが返される。
これは、まだInnerFunc関数が実行されていない状態である。
この状態を記憶して、後で使用することができるものがクロージャである。ここでは、InnerFuncがクロージャになる。
def OuterFunc(a, b):
def InnerFunc():
return a + b
return InnerFunc
print(OuterFunc(2, 3))
# 出力
<function outer_function.<locals>.inner_function at 0x10d86b7b8>
クロージャの実行
クロージャを実行するには、次のように行う。
以下の例では、OuterFunc関数をfuncオブジェクトに代入している。これに、丸括弧()を付けてfuncオブジェクトを実行している。
def OuterFunc(a, b):
def InnerFunc():
return a + b
return InnerFunc
func = OuterFunc(2, 3)
print(func())
# 出力
5
次に、長方形の面積を計算するサンプルコードを記述する。(横(width)と縦(height)を乗算)
以下の例では、引数に横(width)を与えるAreaCalc関数を定義して、その中に縦(height)を引数を定義して面積を計算するAreaCalcFunc関数を定義している。
戻り値は、丸括弧()を外したAareaCalcFuncオブジェクトを返す。(クロージャになっている)
まず、2種類の横の数値を与えた後、オブジェクト変数ac1とac2にAreaCalcFuncオブジェクトを代入している。
このオブジェクト変数ac1とac2に丸括弧()を付けて縦の数値を与えることで計算が実行される。
def AreaCalc(width):
def AreaCalcFunc(height):
return width * height
return AreaCalcFunc
# widthが25と50の場合を計算
ac1 = AreaCalc(25)
ac2 = AreaCalc(50)
# heightを10として面積を求める
print(ac1(10))
print(ac2(10))
# 出力
250
500