因为列表生成式会把列表的所有内容计算出来,有时太占内存,所以需要写成列表生成器,列表生成器相当于写出列表的递推公式,需要时可以一步一步的推出我们想要的元素。
比如:
斐波那契数列,其定义就是,第一二位是0和1,后一位等于前两位数字之和,
写成数列就是
{
a
1
=
0
a
2
=
1
a
n
=
a
n
−
1
+
a
n
−
2
,
n
>
2
\begin{cases} a_{1}=0\\ a_{2}=1\\ a_{n}=a_{n-1}+a_{n-2}&&&,n>2 \end{cases}
⎩⎪⎨⎪⎧a1=0a2=1an=an−1+an−2,n>2
这就是他的递推公式,生成器即是生成这个递推公式。所以有如下代码:
>>>def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return 'done'
#调用并运行
>>> for i in fib(6):
print(i)
1
1
2
3
5
8
再举一个例子,
杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
...
可见第一行是1,第二行多一列,且若将第一行扩充,前后各加一个0,成为(0,1);(1,0),这两个相加即是第二行,以此类推。因此,可有代码:
def yanghuitri(m):
L=[1]
n=0 #初始条件
while true:
while n<m:
yield L
L=[sum(i) for i in zip(([0]+L]),(L+[0]))]
n=n+1
return 'done'
>>> for x in yanghuitri(6):
print(x)
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
zip函数:zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。具体用法可看这里