Python クロージャーの簡単な使い方

Pythonではクロージャーを簡単に使うことができます。

クロージャーとはわかるようなわからないような・・・簡単にいうとこんな感じです。

  • 関数Aの中にある関数Bのこと(関数内関数)
  • 関数Aのパラメータを関数Bが使う
  • 関数Aは関数Bを返す
  • 外から関数Aを使用すると、関数B型の変数を使用できる ※ここが重要

クロージャーをザックリいうとこんな感じですが、説明だけ読んでもよくわからないので、Pythonのクロージャーを具体的に使用してみましょう!

Python クロージャーの使い方

クロージャー構文

# 親関数
def 関数A(引数A)
    # 子関数 クロージャー
    def 関数B
        引数Aを使う処理
    return 関数B
# クロージャーを呼び出す
クロージャー変数 = 関数A(引数A)

クロージャーのおもな使い方の構文です。関数Aの中にある関数Bがクロージャーです。

関数Aの戻り値は関数Bになります。この関数B型の変数を実行しても関数Aの値が引き継がれています。

具体的なPythonのクロージャーの使い方は次の例をみてください。

 

例1. クロージャーを使ってリストの平均を求める

クロージャー

# 親関数
def get_avg(lst):
    # 子関数 クロージャー
    def get_avg_min(min):
        for i in lst:
            if i >= min:
                sum += i
                cnt += 1
        return sum / cnt
    return get_avg_min

親関数「get_avg」の中に子関数「get_avg_min」があります。子関数「get_avg_min」がクロージャーです。

親関数「get_avg」の引数「lst」を子関数「get_avg_min」で使用しました。引数「lst」はリスト型の配列です。親関数のリストを1つずつ取り出して平均を求めます。

子関数「get_avg_min」にも引数「min」があります。引数「min」は親関数の引数「lst」の下限値を決めます。引数「min」未満は無視します。

親関数「get_avg」の戻り値は子関数「get_avg_min」です。

つまりこの関数では、親関数に渡された配列の平均を子関数が求めますが、子関数で下限値以上という条件をつけています。

呼び出し側

# 親関数を実行してクロージャーを取得する
avg = get_avg([3, 6, 9])

次は前述した関数を使います。

「3, 6, 9」という3つ要素をもつリストを関数「get_avg」に渡して実行しました。関数「get_avg」の戻り値「avg」は関数「get_avg_min」型、つまりクロージャー型です。

この戻り値のクロージャー変数「avg」が重要です!

# クロージャーを実行
avg_min = avg(0)
print(avg_min)
#[結果] 6

このクロージャー「avg」に対して「avg(0)」とすると、子関数「get_avg_min(0)」を実行したことになります。親関数の戻り値に引数を渡して実行すると子関数が実行されます。ここがポイントです。

「3, 6, 9」の平均で条件は0以上なので、結果は「6」となりました。

# クロージャーを実行
avg_min = avg(5)
print(avg_min)
#[結果] 7.5

次は引数を変えてみます。

「avg(5)」とすると、子関数「get_avg_min(5)」を実行したことになります。「3, 6, 9」の平均で条件は5以上なので、「6, 9」の平均となり、結果は「7.5」となりました。

親関数を実行すると子関数のクロージャー型となり、クロージャーが実行されたときに親関数の引数の値を使う感覚はつかめたでしょうか?

これでクロージャー関数を使って平均を求めることができました。

Pythonのクロージャーの使い方を解説しました。

コメント