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