在使用中,请注意生成器对象与生成器函数之间的区别。
与生成器函数相反,生成器对象只能使用一次,因为生成器函数会返回一个新的生成器对象,因此生成器对象可以在每次再次调用时重用。
实际上,生成器表达式通常使用“原始”,而不将它们包装在函数中,并且它们返回生成器对象。
例如:
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]
[]
[]