「Pythonの基礎 - クロージャ」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == Pythonには、クロージャというものが存在する。<br> <br> クロージャとは、参照環境を伴ったような関数、あるいはその…」)
 
(文字列「</source>」を「</syntaxhighlight>」に置換)
 
(同じ利用者による、間の2版が非表示)
8行目: 8行目:
== クロージャを理解する ==
== クロージャを理解する ==
まず、クロージャを理解するために、関数内関数を見ておく。<br>
まず、クロージャを理解するために、関数内関数を見ておく。<br>
  <source lang="python">
  <syntaxhighlight lang="python">
  def OuterFunc(a, b):
  def OuterFunc(a, b):
     def InnerFunc():
     def InnerFunc():
19行目: 19行目:
  # 出力
  # 出力
  5
  5
  </source>
  </syntaxhighlight>
<br>
<br>
クロージャは、上記のサンプルコードを次のように変更する。<br>
クロージャは、上記のサンプルコードを次のように変更する。<br>
27行目: 27行目:
これは、まだInnerFunc関数が実行されていない状態である。<br>
これは、まだInnerFunc関数が実行されていない状態である。<br>
この状態を記憶して、後で使用することができるものがクロージャである。ここでは、InnerFuncがクロージャになる。<br>
この状態を記憶して、後で使用することができるものがクロージャである。ここでは、InnerFuncがクロージャになる。<br>
  <source lang="python">
  <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>  
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


44行目: 44行目:
クロージャを実行するには、次のように行う。<br>
クロージャを実行するには、次のように行う。<br>
以下の例では、OuterFunc関数をfuncオブジェクトに代入している。これに、丸括弧()を付けてfuncオブジェクトを実行している。<br>
以下の例では、OuterFunc関数をfuncオブジェクトに代入している。これに、丸括弧()を付けてfuncオブジェクトを実行している。<br>
  <source lang="python">
  <syntaxhighlight lang="python">
  def OuterFunc(a, b):
  def OuterFunc(a, b):
     def InnerFunc():
     def InnerFunc():
55行目: 55行目:
  # 出力
  # 出力
  5
  5
  </source>
  </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>
  <source lang="python">
  <syntaxhighlight lang="python">
  def AreaCalc(width):
  def AreaCalc(width):
     def AreaCalcFunc(height):
     def AreaCalcFunc(height):
81行目: 81行目:
  250
  250
  500
  500
  </source>
  </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