学习了一个新玩意——“生成器”,有别于列表,它是一边循环一边计算,节省内存的一种机制。
应用,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
#斐波拉契数列
deffib(max):
n,a,b =,,1
whilen < max:
print(b)
a,b = b,a + b
n = n +1
return'done'
print(fib(6))
输出:
done
要实现一个“生成器”只需要再上述代码上稍加改进就可以了。
deffib(max):
n,a,b =,,1
whilen < max:
yieldb
a,b = b,a + b
n = n +1
return'done'
print(fib(6))
输出:
deffib(max):
n,a,b =,,1
whilen < max:
yieldb
a,b = b,a + b
n = n +1
return'done'
print(fib(6))
forninfib(6):
print(n)
输出:
练习:
杨辉三角定义如下:
把每一行看做一个list,试写一个generator,不断输出下一行的list:
# 期待输出:# [1]# [1, 1]# [1, 2, 1]# [1, 3, 3, 1]# [1, 4, 6, 4, 1]# [1, 5, 10, 10, 5, 1]# [1, 6, 15, 20, 15, 6, 1]# [1, 7, 21, 35, 35, 21, 7, 1]# [1, 8, 28, 56, 70, 56, 28, 8, 1]# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
#杨辉三角
deftriangles(max):
L=[1]
n=
whilen < max:
yieldL
L=[L[i]+L[i+1]foriinrange(len(L)-1)]
L.insert(,1)
L.append(1)
n+=1
print(triangles(8))
forLintriangles(8):
print(L)
关键代码解读:
L=[L[i]+L[i+1]foriinrange(len(L)-1)]
range(len(L)-1)
生成一个从0到(len(L)-1)的列表,将L[i]和L[i+1]的和存入列表中。
L.insert(,1)
L.append(1)
在列表的首部与尾部插入一个元素“1”。
测试输出:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
领取专属 10元无门槛券
私享最新 技术干货