デコレータ、イテレータ、およびジェネレータは、それぞれ関数またはメソッドの機能を拡張し、コンテナ要素を走査し、コンパクトなイテレータを作成するための Python の高度な機能です。
デコレーター
デコレーターは、関数またはメソッドの機能を変更または拡張するために使用される関数です。デコレータは関数を引数として受け取り、新しい関数を返します。これにより、通常は元の関数に追加の機能が追加されます。デコレータの一般的な用途には、ロギング、パフォーマンス テスト、権限チェックなどが含まれます。
def demo_decorator(func):
def hh(*args, **kwargs):
print("Before function call")
result = func(*args, **kwargs)
print("After function call")
return hh
return wrapper
@demo_decorator
def a_function():
print("Inside function")
a_function()
'''
结果:
Before function call
Inside function
After function call
'''
最下層: 基本的には高階関数であり、クロージャとして、内部関数が外部関数参照を呼び出し、内部関数を返します。装飾された関数が呼び出されると、デコレーターによって返された新しい関数が実際に呼び出されます。
クロージャとは、関数がスコープを離れた後でも、関数が定義されたスコープ内のローカル変数を記録してアクセスできることを意味します。一般に、特定の動作を持つ関数を作成するために使用され、グローバル変数なしで関数の状態を保存できるようになります。Python では、クロージャは、ネストされた関数を定義し、外側のスコープ変数をキャプチャすることによって実装されます。
イテレータ
イテレーターは、コンテナーの要素 (リスト、タプル、セットなど) を走査するために使用される Python のオブジェクトです。イテレータは __iter__()
and __next__()
メソッドを実装します。これは、コンテナの要素を走査するための統合インターフェイスを提供するため、 for
ループや他の反復メソッドで使用できます。
class DemoIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
# 使用自定义的迭代器遍历列表
my_list = [1, 2, 3, 4, 5]
iterator = DemoIterator(my_list)
for item in iterator:
print(item)
'''
1
2
3
4
5
'''
下: __iter__()
と の __next__()
メソッドに依存します。for
ループ内でイテレータを使用する 場合 、Python は最初に__iter__()
メソッドを呼び出してイテレータ オブジェクトを取得し、次に 反復が完了したことを示す例外が発生する__next__()
まで、メソッドを繰り返し呼び出してコンテナの次の要素を取得します 。StopIteration
ほとんどの場合、反復子を手動で実装する必要はありません。カスタム コンテナ タイプを作成する場合にのみ、イテレータ インターフェイスの実装が必要になる場合があります。
反復可能オブジェクト (Iterable) は、 Python の特定の走査ルールを持つオブジェクト であり、for
ループまたは他の反復メソッドで使用できます。
-
反復可能なオブジェクトはメソッドを実装します
__iter__()
。for
ループまたは他の反復メソッドで反復可能オブジェクトが使用されると、 Python はこのメソッドを自動的に呼び出します。__iter__()
メソッドは、コンテナの要素を走査するためのイテレータ オブジェクトを返します。 -
Iterator オブジェクトはメソッドを実装します
__next__()
。反復ごとに、Python はこのメソッドを呼び出して、コンテナーの次の要素を取得します。反復処理する要素がなくなった場合、__next__()
メソッドはStopIteration
例外をスローして、Python に反復を終了するように指示する必要があります。
ビルダー
ジェネレーターは、より簡潔な方法でイテレーターを作成できるようにする特別な種類のイテレーターです。ジェネレーターは、メソッドを明示的に実装するのではなく、ステートメントを使用して 値 yield
のシーケンスを生成します 。ジェネレーター関数が呼び出されると、生成された値を反復処理するために使用できるジェネレーター オブジェクトが返されます。__iter__()
__next__()
def demo_generator(n):
i = 0
while i < n:
yield i
i += 1
for item in demo_generator(5):
print(item)
'''
0
1
2
3
4
'''
下: yield
ステートメントとジェネレーター関数に依存します。ジェネレーター関数が呼び出されると、実際にはイテレーターであるジェネレーター オブジェクトが返され、関数の状態 (ローカル変数、命令ポインターなどを含む) が自動的に保存されます。中断したところから実行を続行します。ステートメントが検出される とyield
、ジェネレーターは関数の実行を一時停止し、 yield
ステートメントの後の値を反復の現在の値として返します。関数が再度呼び出されると next()
、ジェネレータは次の yield
ステートメントが見つかるか StopIteration
例外がスローされるまで、中断したところから実行を再開します。
yield
は、ジェネレーターを実装するために使用される Python のキーワードです。基本的に、yield
実装は Python のコルーチン メカニズムに依存しています。ジェネレーター関数に yield
ステートメントが含まれている場合、コンパイラーはその関数を通常の関数ではなくジェネレーターとして認識します。ジェネレーター関数の実行は、現在の状態を維持しながら実行中に一時停止および再開できるという点で通常の関数の実行とは異なります。