Programmingバックエンド開発者

Pythonにおけるイテレータの働きについて教えてください。独自のイテレータをどのように実装しますか?イテレータとイテラブルオブジェクトの違いは何ですか?

Hintsage AIアシスタントで面接を突破

答え。

Pythonにおけるイテレータは、イテレータプロトコルを実装するオブジェクトです:__iter__()メソッドと__next__()メソッド。イテレータは内部状態を管理し、next()を呼び出すたびに、シーケンスの次の要素を返すか、終了時にStopIteration例外をスローします。

イテラブルオブジェクトは、ループで反復処理できるものです(例えば、リスト、文字列、辞書など)。すべてのイテラブルオブジェクトは、イテレータを返す__iter__()メソッドを持っています。

独自のイテレータを実装するには、__iter__()(selfを返す)と__next__()(次の要素を取得するロジックを実装する)というメソッドを持つクラスを作成する必要があります:

class Counter: def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return self def __next__(self): if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1 for num in Counter(1, 3): print(num) # 1 2 3

騙しの質問。

イテラブルオブジェクトとイテレータの違いは何ですか?イテレータを複数回イテレートできますか?

答え: イテラブルオブジェクトは、イテレータを返す__iter__()メソッドのみが実装されています。イテレータは、__next__()メソッドを持つオブジェクトです。イテレータは通常、1回だけイテレートされます:シーケンスの終わりに到達した後、再度のイテレーションは新しいイテレータを作成しない限り不可能です。

このテーマの微妙な違いを知らないことによる実際のエラーの例。


ログ分析のプロジェクトで、ある開発者がイテレータを受け取る関数を作成し、2回そのイテレータを走査しようとしました(for log in logs:)。2回目の走査では何も返されませんでした。なぜなら、イテレータはすでに"使い果たされて"いたからです。


あるモジュールで、開発者が関数からリストではなく、1回だけイテレート可能なジェネレータを返しました。それを複数回の走査を期待している別の関数に渡そうとすると、予期しないエラーが発生し、空の結果となりました。


Web APIプロジェクトで、開発者はイテレータを直接JSONにシリアライズしようとしました。イテレータはリストではなく、リストに変換する前提なしには変換不可能であり(そうでなければシリアライズは例外で終了します)。