CodeGym /コース /Python SELF JA /クロージャ

クロージャ

Python SELF JA
レベル 13, レッスン 3
使用可能

3.1 クロージャの紹介

クロージャっていうのは、自分の外側のスコープから変数をキャプチャする関数のことだよ。 このスコープが終わった後でも使えるってことね。つまり、クロージャは自分の外側スコープの 変数の値を「覚えていて」、そのスコープがもうアクティブじゃなくても使い続けられるってこと。

クロージャがどう動くか理解するために、次の例を見てみよう:


def outer_function(x):
    def inner_function(y):
        return x + y

    return inner_function
    
closure = outer_function(10)
print(closure(5))  # 出力: 15

このコードを解説してみよう:

外側の関数 (outer_function): この関数は 引数xを取り、内側の関数inner_functionを定義するよ。 inner_functionは引数yを取って、xとyの合計を返すんだ。 outer_functionの中ではinner_functionは呼び出されずに、ただ定義されるだけ。

内側の関数 (inner_function): この関数は outer_functionから返され、自分の中にouter_functionに渡された xの値を保持するんだ。

クロージャ: 変数closureはクロージャになって、 xの値(この場合は10)を「覚えていて」、呼び出し時に使えるようになるんだよ。

初めてクロージャに触れると、普通はうまく使えないことが多いね。 だから、いろいろな例を使って、クロージャの理解を深めてみよう。

3.2 クロージャの使い方の例

関数ジェネレータの作成

クロージャは、値のシーケンスを生成する関数ジェネレータを作るために使うことができるよ。


def make_counter():
    count = 0

    def counter():
        nonlocal count
        count += 1
        return count

    return counter
    
counter = make_counter()
print(counter())  # 出力: 1
print(counter())  # 出力: 2
print(counter())  # 出力: 3

解説:

関数ジェネレータ (make_counter): この関数は count変数を作って、内部関数counterを返すんだ。 そのcounterはcountを増やして、それを返すんだ。

クロージャ: 関数counterはcount変数の状態を保持して、 呼び出しごとにそれを変更できるんだ。

設定を持つ関数の作成

クロージャは事前に設定された設定を持つ関数を作るために使えるよ。


def make_multiplier(factor):
    def multiplier(x):
        return x * factor

    return multiplier
    
double = make_multiplier(2)
triple = make_multiplier(3)
    
print(double(5))  # 出力: 10
print(triple(5))  # 出力: 15

解説:

設定関数 (make_multiplier): この関数は factorを受け取って、入力値をfactorで掛ける内部関数multiplierを返すよ。

クロージャ: 関数doubleとtripleはクロージャになって、 自分のfactorの値を保持して、それを掛け算に使うんだ。

パラメータを持つデータフィルタリング

クロージャはパラメータ付きのフィルタリング関数を作るために役立つよ。


def make_filter(threshold):
    def filter_func(value):
        return value > threshold
        
    return filter_func
    
filter_above_10 = make_filter(10)
data = [5, 10, 15, 20]
filtered_data = list(filter(filter_above_10, data))
print(filtered_data)  # 出力: [15, 20]

解説:

フィルタ関数 (make_filter): この関数は 閾値thresholdを受け取って、値が閾値を超えるかどうかを チェックする内部関数filter_funcを返すんだ。

クロージャ: 関数filter_funcはthresholdの値を保持して、 データをフィルタリングするためにそれを使うんだ。

3.3 クロージャのメリットとデメリット

クロージャを使う利点

状態のカプセル化: クロージャはグローバル変数を避けて、 コードの可読性と管理を向上させながら、関数内に状態をカプセル化できるんだ。

柔軟性: クロージャは特定の設定や動作を持つ関数の作成に使えるので、 コードをより柔軟で適応可能にするよ。

関数型プログラミング: クロージャは高階関数や他の関数型構造を 作成するために、関数型プログラミングで重要な概念だね。

制限と潜在的な問題

たくさんの利点があるにもかかわらず、クロージャには制限もあるよ:

メモリの使用: クロージャはもう使われていないオブジェクトへの リンクを保持できるので、メモリリークを引き起こす可能性があるんだ。

デバッグの難しさ: クロージャは変数の状態が明確でないため、 コードのデバッグを難しくすることがあるんだ。

2
タスク
Python SELF JA, レベル 13, レッスン 3
ロック未解除
ジェネレータ。
ジェネレータ。
2
タスク
Python SELF JA, レベル 13, レッスン 3
ロック未解除
クロージャ。
クロージャ。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION