列表生成式
a = [i+1 for i in range(10)]
print (a)
#a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成器
生成器不需要创建整个列表,节省内存;
generator保存的是算法,每次调用next(generator),就计算出generator的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
也可以通过for函数访问
a = (i+1 for i in range(10))
print (a)
#<generator object <genexpr> at 0x117116050>
print (next(a))
#1
for g in a:
print (g)
#1
#2
#3
...
#10
应用:斐波那契数列
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,b+a
n += 1
print (fib(6))
for i in (fib(6)):
print (i)
这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
网友评论