使用時には、ジェネレーター オブジェクトとジェネレーター関数の違いに注意してください。
ジェネレーター オブジェクトは、新しいジェネレーター オブジェクトを返すため、もう一度呼び出すたびに再利用できるジェネレーター関数とは対照的に、一度だけ使用できます。
ジェネレーター式は、実際には通常、関数でラップせずに「そのまま」使用され、ジェネレーター オブジェクトを返します。
例えば:
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]
[]
[]