Pythonのイテレーターとジェネレーターの違いは何ですか?
Pythonにおいて、イテレータとジェネレータはともに反復操作を行うために使用されますが、実装方法や使用法にはわずかな違いがあります。
イテレータ(Iterator)は、イテレーションプロトコルを実装したオブジェクトであり、iter()関数を使用して取得することができます。イテレータオブジェクトは、__iter__()メソッドと__next__()メソッドを実装する必要があります。iter()メソッドはイテレータオブジェクト自体を返し、next()メソッドは次のイテレーション値を返します。もはや要素をイテレートすることができない場合、next()メソッドはStopIteration例外を発生させる必要があります。
ジェネレータは、yieldキーワードで定義される特別なイテレータであり、ジェネレータ関数はyieldステートメントが呼び出されるたびに一時停止し、すべての実行情報を保存してジェネレータオブジェクトを返します。次に、__next__()メソッドが再度呼び出されると、前回一時停止した位置から実行を再開し、次のyieldステートメントに遭遇するまで続行されます。ジェネレータは、forループを使用してイテレーションすることも、next()関数を使用して手動でイテレーションすることもできます。
生成器の主な利点は、シーケンスを生成する際に完全なシーケンスを作成する必要がないことであり、生成と使用を同時に行うことができるため、メモリスペースを節約できる。一方、イテレータは完全なシーケンスをメモリ内に保存する必要がある。
要简单总结一下,迭代器是遵循迭代协议的对象,使用__iter__()和__next__()方法进行迭代;而生成器是一种特殊的迭代器,使用yield关键字定义,可以实时生成和使用。