码迷,mamicode.com
首页 > 编程语言 > 详细

Python不归路_生成器

时间:2017-08-25 16:58:58      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:while   开发   系统   var   特殊   style   logs   exp   算法   

生成器:生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成器【Generator】,生成器具有一边计算一边生生成的功能,起到节省空间的作用,真正能做到按需所取。来看下面这段代码:

[ x**2 for x in range(20) ]
输出结果: [
0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
---------------------------------------------------------------------------------------
A = [x**2 for x in range(20)]
type(A)
输出结果:
<class ‘list‘>
---------------------------------------------------------------------------------------
B=( x**2 for x in range(20) )
print(B)
输出结果:
<generator object <genexpr> at 0x0000015C857D7EB8>

我们可以看到A的输出结果是一个列表,我们试想一下,当列表中元素的数量很多时,会大大占用系统空间,加重cpu负载。而B的输出结果是生成器的内存空间,但是我们也想要得到A的输出结果,怎么办呢?我们可以使用__next__()来调用元素,每执行一次__next__(),向后调用一个元素。


B=( x**2 for x in range(20) )
print(B.__next__())
print(B.__next__())
print(B.__next__())
print(B.__next__())
输出结果:
0  # x=0
1  # x=1  
4  # x=2
9  # x=3

 每次调用一个元素,如果元素多了是不是很麻烦?所以__next__基本不会使用,而会使用for循环来迭代。generator非常强大,如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。一般带有yield关键字的函数就被称为生成器。

来看这段代码

def func1(x):
    while x < 1000:
        n = x**2
        yield n
        x+=1
f=func1(200)
for i in f:
    print(i)

func1(x)函数就是一个生成器,当运行该func1(x),函数成了生成器,并通过yield来调用每一次的值。

总结:

一般带有yield的函数都是生成器,生成器使用方法__next__()取值,而且一次只能调取一个值,如要调取多个值,可以使用for来迭代取值。生成器可以作到按需取值,减少负载的作用。

 

 

 

  

 -------不会开发的运维不是好厨师

Python不归路_生成器

标签:while   开发   系统   var   特殊   style   logs   exp   算法   

原文地址:http://www.cnblogs.com/gally-jiang/p/7421306.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!