python 3之yield关键字—生成器,最粗暴的解释
首先,正常使用List接收数据,函数normal例子如下:
>>> def normal(n):
... ls=[]
... for i in range(n):
... ls.append(i)
... return ls
使用for循环遍历List数据,如下:
>>> for i in normal(10):
... i
...#结果如下:
0
1
2
3
4
5
6
7
8
9
这次加入yield关键字,并去掉return,函数yieldDemo例子如下:
>>> def yieldDemo(n):
... ls=[]
... for i in range(n):
... ls.append(i)
... yield ls
使用for循环遍历List数据,如下:
>>> for i in yieldDemo(10):
... i
...#结果如下:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
从上可知,yield 具有return的功能,但和return 不同的是,return 返回数值后,不可能再次进入函数,并接着进行下一次循环!!!
returnDemo例子如下:
>>> def returnDemo(n):
... ls=[]
... for i in range(n):
... ls.append(i)
... return ls
使用for循环遍历List数据,如下:
>>> for i in returnDemo(10):
... i
... #结果如下:
0
除此之外,我们还发现,使用即使已经遍历了yieldDemo(10),但返回竟然是列表类型;
我们通过查看yieldDemo(10)的类型,可知yieldDemo(10)返回的数据类型为“”生成器“”
>>> type(yieldDemo(10))
<class 'generator'>
此时,如果需要遍历显示10000000000000条数据时,使用列表接收就太费内存了!!!!
因此可以使用yield,例子如下:
10条数据为例。。。。。
>>> def yieldDemo2(n):
... for i in range(n):
... yield i
...
>>> for i in yieldDemo2(10):
... i
...
0
1
2
3
4
5
6
7
8
9
此时,每一次for循环,都会把数值输出,而不是存储在列表类型中,是不是更节省存储空间呢??
yield 的使用远不止如此,只是拙见!!有问题欢迎留言讨论。