博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 基础——generate生成器
阅读量:5139 次
发布时间:2019-06-13

本文共 2586 字,大约阅读时间需要 8 分钟。

通过列表表达式可以直接生成列表,不过列表一旦生成就需要为所有元素分配内存,有时候会很消耗资源。

所以,如果列表元素可以按照某种算法推算出来,这样就不必创建完整的list,从而节省大量的内存空间。

在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

创建列表

法一:test = range(10)print type(test)# 
法二:test = [item for item in range(10)]print type(test)#

创建生成器

test = (item for item in range(10))print type(test)# 

生成器是一个可以自动推导后续元素的对象,为了得到其元素,我们可以直接通过 next() 方法:

test = (item for item in range(10))print type(test)print test.next()print test.next()print test.next()# 
# 0# 1# 2

另外一种方式是用 for 可以直接迭代生成器的所有元素:

test = (item for item in range(10))print type(test)for item in test:    print item# 
# 0# 1# 2# 3# 4# 5# 6# 7# 8# 9

注意,每一次调用 next() 都使得生成器推导出下一个元素,使得生成器的元素减少:

test = (item for item in range(10))print type(test)print test.next()print test.next()#至此,生成器中只还有8个元素for index, item in enumerate(test):    print index, '=', item# 
# 0# 1# 0 = 2# 1 = 3# 2 = 4# 3 = 5# 4 = 6# 5 = 7# 6 = 8# 7 = 9

用函数创建生成器

如果函数中包含 yield ,那么该函数就变成了一个生成器。

函数类型的生成器的特点是:在每次调用 next() 的时候执行,遇到 yield 语句就完成一个元素的推导并返回,再次执行 next() 时从上次返回的 yield 语句处继续向后执行:

def func():                       def func():    print 'one'                       print 'one'    yield 1                           yield 1    print 'two'                       print 'two'    yield 2                           yield 2    print 'three'                     print 'three'    yield 3                           yield 3test = func()                     test = func()test.next()                       test.next()test.next()                       test.next()for item in test:                 for item in test:    print item                        item# one                              # one# two                              # two# three                            # three# 3                                #            此时并没有打印生成器的最后一个元素值

生成器函数应用示例

用生成器产生斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

直接打印元素:

def func(max):    before = 0    after = 1    while after < max:        print before        before, after = after, before + after        func(10)# 0# 1# 1# 2# 3# 5

使用列表保存结果:

def func(max):    list = []    before = 0    after = 1        while after < max:        list.append(before)        before, after = after, before + after    return list        my_list = func(10)print my_list# [0, 1, 1, 2, 3, 5]

使用生成器:

def func(max):    before = 0    after = 1    while after < max:        yield before        before, after = after, before + after        test = func(10)print testfor item in test:    print item# 
# 0# 1# 1# 2# 3# 5

 

转载于:https://www.cnblogs.com/licongyu/p/5768141.html

你可能感兴趣的文章
Winform开发框架之图表报表在线设计器2-图表-SNF.EasyQuery项目--SNF快速开发平台3.3-Spring.Net.Framework...
查看>>
C#基础第八天-作业-设计类-面向对象方式实现两个帐户之间转账
查看>>
洛谷 P3237 [HNOI2014]米特运输
查看>>
Attributes.Add用途与用法
查看>>
JavaScript面向对象初探——封装和继承
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
【概率】poj 2096:Collecting Bugs
查看>>
javascript 无限分类
查看>>
【自制插件】MMD4Maya
查看>>
解决linux服务器乱码
查看>>
mapbox.gl文字标注算法基本介绍
查看>>
【C++】异常简述(二):C++的异常处理机制
查看>>
web.config在哪里
查看>>
SQL Server 2000 版本支持的最大物理内存量
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
Redis 常用数据结构命令
查看>>
软件工程课堂作业
查看>>