使用方法では、ジェネレータオブジェクトとジェネレータ関数の違いに注意してください。
ジェネレーターオブジェクトは、新しいジェネレーターオブジェクトを返すため、再度呼び出すたびに再利用できるジェネレーター関数とは対照的に、1回限りの使用のみです。
ジェネレータ式は実際には、通常、関数でラップせずに「生」で使用され、ジェネレータオブジェクトを返します。
例えば:
def range_10_gen_func():
x = 0
while x < 10:
yield x
x = x + 1
print(list(range_10_gen_func()))
print(list(range_10_gen_func()))
print(list(range_10_gen_func()))
出力:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
少し異なる使用法と比較してください。
range_10_gen = range_10_gen_func()
print(list(range_10_gen))
print(list(range_10_gen))
print(list(range_10_gen))
出力:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[]
[]
そしてジェネレータ式と比較してください:
range_10_gen_expr = (x for x in range(10))
print(list(range_10_gen_expr))
print(list(range_10_gen_expr))
print(list(range_10_gen_expr))
これも出力します:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[]
[]