ホームページ  >  記事  >  バックエンド開発  >  Python のクロージャについて簡単に説明します

Python のクロージャについて簡単に説明します

WBOY
WBOYオリジナル
2016-12-05 13:27:181097ブラウズ

Pythonのクロージャ

数日前に誰かが別のメッセージを残しましたが、そのうちの 1 つがどのように使用されるかわかりません闭包re.sub。 Script Home で検索してみると、クロージャに関することを書いたことがなかったので、Python の内容をまとめて改善することにしました。

1. クロージャの概念

まず、クロージャとは何かという基本的な概念から始める必要があります。 Wiki の説明を見てみましょう:

コードをコピー コードは次のとおりです:
コンピュータサイエンスにおいて、クロージャー(Closure)とは字句閉包(Lexical Closure)の略称で、自由変数を参照する関数のことです。参照された自由変数は、関数が作成された環境を離れた後も関数とともに残ります。したがって、クロージャは関数とそれに関連する参照環境で構成されるエンティティである、という別の言い方もできます。クロージャは実行時に複数のインスタンスを持つことができ、異なる参照環境と同じ関数の組み合わせによって異なるインスタンスが生成されることがあります。
....

自由変数と関数という 2 つの重要な点については後で説明します。 「クロージャ」の意味についてはまだ詳しく説明する必要がありますが、このパッケージは関数の内部にあることは明らかです。パッケージ内では変数は自由であり、自由な変数はパッケージ内を歩き回ることができます。もちろん、このパッケージが作成されるという前提があります。

Python 言語を通して説明すると、クロージャは関数 A を呼び出し、この関数 A が関数 B を返すことを意味します。この返された関数 B をクロージャと呼びます。関数 A を呼び出すときに渡すパラメーターは自由変数です。

例:

リーリー

ここで func が呼び出されると、クロージャ inner_func が生成され、クロージャは自由変数 name を保持します。つまり、関数 func のライフサイクルが終了しても変数名はまだ存在することを意味します。閉じた場合、リサイクルされません。

さらに、クロージャは Python 固有の概念ではありません。関数を第一級市民として扱うすべての言語にはクロージャの概念があります。ただし、クロージャは、クラスが第一級市民である Java のような言語でも使用できますが、クラスまたはインターフェイスを使用して実装する必要があります。

より概念的なことについては、最後にある参考リンクを参照してください。

2. クロージャーを使用する理由

上記の紹介に基づいて、読者はこれがクラスに似ていると感じられるでしょうか。類似点は、どちらもデータのカプセル化を提供することです。違いは、クロージャ自体がメソッドであることです。クラスと同様に、プログラミングの際に (もちろん、現実世界、つまりビジネスのモデル化も同様に) 共通の機能を再利用するために、共通のものをクラスに抽象化します。クロージャについても同様です。関数の詳細な抽象化が必要な場合は、クロージャが適しています。

この時点では、クロージャは読み取り専用オブジェクトとして理解できますが、プロパティを渡すことはできますが、提供できるのは実行インターフェイスのみです。したがって、プログラムでは、後で説明するデコレータなどの共通関数を完了するために、このような関数オブジェクト (クロージャ) が必要になることがよくあります。

3. クロージャを使用する

最初のシナリオは、Python の非常に重要で一般的な使用シナリオです。Python は、デコレーターに非常に使いやすい「構文糖体」を提供します。これにより、デコレーターを非常に便利に使用できるようになります。つまり、関数 func に @decorator_func を追加すると、decorator_func(func):

と同等になります。
リーリー

このデコレータの例では、クロージャ (ラッパー) は外部 func パラメータを保持し、受け入れられたパラメータはそのまま func に渡され、実行結果が返されます。

これは簡単な例ですが、もう少し複雑な場合は、頻繁に使用される LRUCache デコレータなどの複数のクロージャを使用できます。デコレータは @lru_cache(expire=500) のようなパラメータを受け入れることができます。実装は 2 つのクロージャーのネストです:

リーリー

クロージャについてあまり知らない学生でも、上記のコードは理解できるはずです。これは、以前のインタビューでよく聞かれた質問です。

2 番目のシナリオは、クロージャーの機能「遅延評価」に基づいています。このアプリケーションは、データベースにアクセスするときによく使用されます。例:

リーリー

上記の不適切な例は、クロージャによる遅延評価の関数を示していますが、上記のクエリによって返される結果は関数ではなく、関数関数を備えたクラスです。興味があれば、Django のクエリセットの実装を見てください。原理は同様です。

3 番目のシナリオは、関数のパラメーターを事前に割り当てる必要がある場合です。もちろん、Python には functools.parial にアクセスするための優れた解決策がありますが、クロージャーを使用して実現することもできます。

リーリー

これも突飛な例のように思えますが、クロージャの実用的な応用とみなすことができます。

最後に、クロージャは理解しやすく、Python で広く使用されています。ご質問があれば、メッセージを残してください。

4.参考文献

ウィキペディア - 閉鎖

http://stackoverflow.com/questions/4020419/closures-in-python

http://www.shutupandship.com/2012/01/python-closures-explained.html

http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to- language-x-closures

http://mrevelle.blogspot.com/2006/10/closure-on-closures.html

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。