Python 上級: 状態を保持するクロージャ
Feb 07, 2017 pm 05:25 PMクロージャ
Python では、関数もオブジェクトです。したがって、関数を定義するときは、入れ子になった関数を定義して、入れ子になった関数を返すことができます。たとえば:
1 2 3 4 5 |
|
上記のコードでは、関数 make_pow は内部関数 inner_func を定義し、その関数を返します。したがって、make_pow を使用して別の関数を生成できます:
1 2 3 4 5 |
|
また、内部関数 inner_func が外部関数 make_pow の自由変数 n を参照していることにも気付きました。つまり、関数 make_pow のライフサイクルが終了すると、n はこの関数になります。変数は引き続き inner_func によって参照される inner_func に保存されます。
1 2 3 4 5 6 7 8 |
|
---|---
上記の状況と同様に、関数は外部関数の関連するパラメータと変数を参照する内部関数を返します。返された内部関数をクロージャ (Closure) と呼びます。
上記の例では、 inner_func は自由変数 n を参照するクロージャです。
クロージャの役割
クロージャの最大の特徴は、クロージャを生成した環境が解放されても、クロージャは依然として存在することです
クロージャは複数のインスタンスを持つことができます。渡されるパラメータが次のように同じであっても、クロージャを使用してクラスのインスタンスをシミュレートすることもできます。
- ここでクラスを構築して、ある点から別の点までの距離を見つけます:
1
2
3
4
>> > pow_a = make_pow(2)
>> > pow_b = make_pow(2)
>> > pow_a == pow_b
False
ログイン後にコピークロージャを使用して実装します:
1
2
3
4
5
6
7
8
9
10
from math import sqrt
class
Point(object):
def __init__(self, x, y):
self.x, self.y = x, y
def get_distance(self, u, v):
distance = sqrt((self.x - u) ** 2 + (self.y - v) ** 2)
return
distance
>> > pt = Point(7, 2) # 创建一个点
>> > pt.get_distance(10, 6) # 求到另一个点的距离
5.0
ログイン後にコピー
クロージャの概念は非常に単純ですが、次の例のように、その実装においていくつかの誤解が生じやすいです:
1 2 3 4 5 6 7 |
|
この例では、各 for ループに関数を作成し、それを追加します。関数に。さて、上記の関数を呼び出すと、返される結果は 1、2、3 であると思うかもしれませんが、実際はそうではありません:
1 2 3 4 5 6 7 |
|
なぜですか?その理由は、上記の関数 f は変数 i を参照していますが、for ループが終了した時点で関数 f はすぐには実行されず、変数 i の値は 3 であり、func 内の関数が参照する変数はすべて 3 であるためです。 、最終結果はオール3です。
したがって、クロージャ内のループ変数、または後で変更される変数の参照は避けるようにする必要があります。
それでは、上記の状況をどのように解決すればよいでしょうか?次のように、別の関数を作成し、その関数にループ変数の値を渡すことができます:
1 2 3 4 5 6 7 |
|
概要
クロージャは、作成した外部関数のライフサイクルであっても、自由変数を運ぶ関数です。クロージャが終了しても、クロージャによって参照される自由変数はまだ存在します。
- クロージャーは実行時に複数のインスタンスを持つことができます。
- クロージャ内のループ変数、または後で変更される変数を参照しないようにしてください。
- 上記は Python Advanced: Closure Carry State の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する
