。我们通过列表生成器可以快速生成列表如下
[x + x for x in range(10)]可以快速生成一个 x+x的列表
受内存限制 我们不便于创建过大的列表,所以我们需要一种新的方式,于是生成器可以很好的帮我们完成
生成器的书写方法 只需要把[]改成()即可
g = (x * x for x in range(10))
如果我们想访问里面的数据
next(g)会依次输出,可以使用for循环迭代
for n in g:
print(n)即可
def pib(max):
n, a, b=0,0,1
while n <max:
print(b)
a,b=b,a+b
n = n+1
return 'done'
如果想把此代码变成generator只需要把pring(b) 改成yield b即可
然而使用for循环迭代的时候,done也被迭代了
>>> for n in fib(10):
... print(n)
...
1
1
...
34
55
d
o
n
e
这就需要我们捕获异常了,
>>> g= pib(10)
>>> while True:
... try:
... x = next(g)
... print('g:',x)
... except StopIteration as e:
... print('错误:',e.value)
... break
...
g: 1
g: 1
...
g: 21
g: 34
g: 55
错误: done
在教程裴波数列,关于a,b = b,a+b赋值有点疑惑,查询资料后明白了运行机制,记住这一点“先计算后赋值”即可了解其运算规则。
最后是作业使用生成器写一个杨辉三角
自己绞尽脑汁也没有想到做法,看了一下网友的有一个代码思路清晰故拷贝下来珍藏代码如下。
L = [1] # 初始值
while True:
yield(L)
maxIndex = len(L)-1 # 最大下标,下标从0开始
# range(0,n)时,取的是0~(n-1)范围的数
# 第二次获取时,len=1,range(0)=[],因此k=[],L=[1,1]
# 第三次获取时,len=2,range(0,1)=[0],k=[2],L=[1,2,1]
# 第四次获取时,len=3,range(0,2)=[0,1],k=[L[0]+L[1],L[1]+L[2]]]=[3,3],L=[1,3,3,1]
k = [L[j]+L[j+1] for j in range(maxIndex)]
L = [1]+k+[1]