列表中的数据均保存在内存中,若数据量较大的话将会对内存造成很大的消耗。如果在某些情况下仅需访问列表中前几个元素,则后面元素对内存的占用更是浪费。
为了解决此问题,python中出现了生成器:
在python中,一边循环,一边计算的机制称为生成器。
创建生成器的方法主要有两种:
第一种:
>>> g = (x*x for x in range(10))
>>> g
<generator object <genexpr> at 0x000001A4107102C8>
遍历生成器内容的方法:
1、
>>> for i in g:
... print(i)
...
0
1
4
9
16
25
36
49
64
81
2、
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
其实还可以用对象自带的__next__()函数遍历生成器的内容:
>>> g.__next__()
0
>>> g.__next__()
1
>>> g.__next__()
4
>>> g.__next__()
9
>>> g.__next__()
16
>>> g.__next__()
25
>>> g.__next__()
36
>>> g.__next__()
49
>>> g.__next__()
64
>>> g.__next__()
81
>>> g.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
生成生成器(generator)的工作原理实质上就是通过重复调用next()方法,直到捕获一个异常。
第二种: 使用yield函数创建生成器。注意:带有 yield 的函数不再是一个普通函数,而是一个生成器generator。
我们通过斐波那契数列来引出此方法!
我们通过一般函数实现此函数:
def fib(N):
n,a,b = 0,0,1
while n < N:
a,b = b,a+b
n = n+1
print(a)
return "done"
print(fib(10))
#程序运行结果如下:
1
1
2
3
5
8
13
21
34
55
done
我们通过yield函数,通过生成器实现此函数。
def fib(N):
print("斐波那契数列")
n,a,b = 0,0,1
while n < N:
a,b = b,a+b
n = n+1
yield a
return "done"
D = fib(10)
for i in D:
print(i)
#程序运行结果:
斐波那契数列
1
1
2
3
5
8
13
21
34
55
实质上,我们可以将yield函数看作一个收纳器,将这些元素依次收纳进去,需要的时候再依次取出来!
>>> def foo(num):
... while num<8:
... num = num + 1
... yield num
...
>>> a = foo(3)
>>> print(next(a))
4
>>> print(next(a))
5
>>> for i in a:
... print(i)
...
6
7
8
通过上面的例子我们也可以看到,遍历生成器内容的方式有两种,一种是通过next()函数,另一种是通过for循环。
以上内容,如有错误,敬请批评指正!谢谢!