ジェネレーターの空性の決定
Python では、ジェネレーターは、遅延評価と大規模なデータセットの反復処理のための強力なツールです。ただし、ジェネレーターが空であるかどうかを判断するには、その動的な性質により特有の課題が生じます。リストやタプルとは異なり、ジェネレーターにはサイズ属性がありません。単純にそれらを反復処理すると、StopIteration 例外が発生します。
Peek vs. HasNext
提案する人もいるPeak() 関数を使用して、ジェネレーターに項目があるかどうかを確認します。 Peak() を使用すると、ジェネレーターの最初の項目を消費せずに取得できますが、ジェネレーターが空かどうかを判断する方法は提供されません。これは、ジェネレータが空の場合、peek() が StopIteration 例外を発生させるためです。これは、空のジェネレータを反復しようとしたときに発生する例外と区別がつきません。
同様に、hasNext() 関数は、一般的に、 Java にありますが、Python ジェネレーターでは使用できません。
最初から空かどうかを確認する
ジェネレーターが最初から空かどうかを判断するには、応答で提供されるカスタム関数:
def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
この関数はジェネレーターの最初の要素を取得し、ジェネレーターが空の場合は None を返します。また、最初の要素を含む変更されたバージョンを返すことにより、ジェネレーターの状態も保存されます。
Usage
この関数を使用するには、ジェネレーターで関数を呼び出すことができます。引数:
res = peek(mysequence)
if res is None:
# sequence is empty. Do stuff.
else:
first, mysequence = res
# Do something with first, maybe?
# Then iterate over the sequence:
for element in mysequence:
# etc.
このチェックにより、ジェネレーターが空かどうかを判断し、反復する前に空の場合を適切に処理できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3