Pythonの入れ子関数

入れ子関数は、単に別の関数内の関数であり、「内部関数」と呼ばれることもあります。ネストされた関数を使用する理由はたくさんありますが、この記事では最も一般的なものについて説明します。

入れ子関数を定義する方法

ネストされた関数を定義するには、defキーワードを使用して関数内の別の関数を初期化します。

def greeting(first, last): # nested helper function def getFullName(): return first + " " + last print("Hi, " + getFullName() + "!") greeting('Quincy', 'Larson')

出力:

Hi, Quincy Larson!

あなたが見ることができるように、ネストされたgetFullName関数は、外側へのアクセスがあるgreeting関数のパラメータを、firstlast。これは、ネストされた関数の一般的な使用例です。より複雑な外部関数の小さなヘルパー関数として機能します。

入れ子関数を使用する理由

ネストされた関数を使用する正当な理由はたくさんありますが、最も一般的なのはカプセル化とクロージャ/ファクトリ関数です。

データのカプセル化

関数またはその関数がアクセスできるデータがコードの他の部分からアクセスされないようにしたい場合があるため、別の関数内にカプセル化できます。

このような関数をネストすると、グローバルスコープから非表示になります。この動作のため、データのカプセル化は、データの隠蔽またはデータのプライバシーと呼ばれることがあります。例えば:

def outer(): print("I'm the outer function.") def inner(): print("And I'm the inner function.") inner() inner()

出力:

Traceback (most recent call last): File "main.py", line 16, in  inner() NameError: name 'inner' is not defined

上記のコードでは、inner関数は関数内からのみ使用できますouterinner関数の外部から呼び出そうとすると、上記のエラーが発生します。

代わりに、次のようにouter関数を呼び出す必要があります。

def outer(): print("I'm the outer function.") def inner(): print("And I'm the inner function.") inner() outer()

出力:

I'm the outer function. And I'm the inner function.

閉鎖

しかし、上記の例のように呼び出すのではなく、外部関数が内部関数自体を返すとどうなるでしょうか。その場合、クロージャと呼ばれるものがあります。

Pythonでクロージャを作成するために満たす必要のある条件は次のとおりです。

Pythonでクロージャを作成するために必要な条件は次のとおりです。

1.入れ子関数が必要です

2.内部関数は、囲んでいるスコープで定義されている値を参照する必要があります

3.囲んでいる関数は、ネストされた関数を返す必要があります

-ソース://stackabuse.com/python-nested-functions/

クロージャの簡単な例を次に示します。

def num1(x): def num2(y): return x + y return num2 print(num1(10)(5))

出力:

15

クロージャを使用するとgreeting、最初に記事の冒頭の例のようなパラメータを使用してデータを外部関数に渡すことなく、データを内部関数に渡すことができます。また、カプセル化された外部関数の外部から内部関数を呼び出すこともできます。これはすべて、前述のデータのカプセル化/非表示の利点を備えています。

Pythonで関数をネストする方法と理由を理解したので、外に出て、最高の関数をネストします。