在使用中,需要注意生成器对象和生成器函数之间的区别。
生成器对象只能使用一次,而生成器函数可以每次调用时重新使用,因为它会返回一个全新的生成器对象。
通常情况下,生成器表达式通常是“原始”的,不需要将其包装在一个函数中,并且它们返回一个生成器对象。
例如:
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]
[]
[]