通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
#要创建一个generator,第一种只要把一个列表生成式的[]改成(),就创建了一个generator:
L = [x*x for x in range(1,11)]
print(L)
l = (x*x for x in range(1,11))
print(l)
#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#<generator object <genexpr> at 0x00000133B2F035E8>
#L是一个list,而g是一个generator
斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
#要把fib函数变成generator,只需要把print(b)改为yield b就可以
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b #generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
a, b = b, a + b
n = n + 1
return 'done'