ジェネレータの理解はどのように機能しますか? 質問する

ジェネレータの理解はどのように機能しますか? 質問する

ジェネレータの理解とは何をするのでしょうか? どのように動作するのでしょうか? それに関するチュートリアルが見つかりませんでした。

ベストアンサー1

リスト内包表記を理解していますか? 理解している場合、ジェネレータ式はリスト内包表記に似ていますが、関心のあるすべての項目を見つけてリストにパックするのではなく、待機して、式から各項目を 1 つずつ生成します。

>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print(filtered_list)
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
... 
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print(filtered_gen)  # notice it's a generator object
<generator object <genexpr> at 0x7f2ad75f89e0>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
... 
>>> next(filtered_gen)
5
>>> next(filtered_gen)
9
>>> next(filtered_gen)
6
>>> next(filtered_gen) # Should be all out of items and give an error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
... 
>>> # Let's prove it gives the same results as our list comprehension
... 
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print(gen_to_list)
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>> 

ジェネレータ式は一度に 1 つの項目を生成するだけなので、メモリ使用量を大幅に節約できます。ジェネレータ式は、一度に 1 つの項目を取得し、その項目に基づいて多くの計算を行い、次の項目に進む必要があるシナリオで最も効果的です。複数の値が必要な場合は、ジェネレータ式を使用して一度にいくつかの値を取得することもできます。プログラムを進める前にすべての値が必要な場合は、代わりにリストの理解を使用します。

おすすめ記事