在python中, 要产生一个列表,可以这样写:
a=[]
for i in range(10):
a.append(i*2)
但是,这样挺麻烦的,产生一个列表,需要三行语句。所以,有人就想到能不能一行代码来表示呢?其实,也是可以的,如下:
[ i*2 for i in range(10)]
当然,我们也可以写成[func(i) for i in range(10)]
1、这样,通过一个式子就能产生一个列表,我们把这样的式子叫做生成式。
生成式通过算式可以产生符合要求的列表,这个列表是预先产生存在于内存中的,如果列表元素过多,例如100万,或1000万个,就占用特别多的内存,所以,具有一定的缺点。而生成器,占用的内存却是很少的。只要将上方的列表生成式外的方框改成圆括号就算是生成器了。
2、a=(i*2 for i in range(10))
这样产生的元组就是生成器。
生成器要满足三个特眯:
(1)生成器只有在调用时才会产生相应的数据。
(2)只记住当前的位置。
(3)只有一个方法,即__next__()
3、斐波那契数列。
def fib(max):
n,a,b=0,0,1
while n #print(b) yield b a,b=b,a+b #这里相当于t=(b,a+b),a=t[0],b=t[1],和我们平常想的可能有一定的差距。 n=n+1 return('done') 注意:(敲黑板)只要将上方的print(b)改为yield b,此函数就变为了生成器。 变成生成器后有什么好处呢? 访问生成器fib(x)时,可以用__next__()方式随意进出,进出自由,而且读取里面的元素时不须等待时间。不象一次性生成的列表或元组。 yield b 就是返回当前生成器指针所指的值。