Pythonのクロージャ
数日前に誰かが別のメッセージを残しましたが、そのうちの 1 つがどのように使用されるかわかりません闭包
和re.sub
。 Script Home で検索してみると、クロージャに関することを書いたことがなかったので、Python の内容をまとめて改善することにしました。
1. クロージャの概念
まず、クロージャとは何かという基本的な概念から始める必要があります。 Wiki の説明を見てみましょう:
自由変数と関数という 2 つの重要な点については後で説明します。 「クロージャ」の意味についてはまだ詳しく説明する必要がありますが、このパッケージは関数の内部にあることは明らかです。パッケージ内では変数は自由であり、自由な変数はパッケージ内を歩き回ることができます。もちろん、このパッケージが作成されるという前提があります。
例:
ここで 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