Python生成器
2015-08-08 20:05
585 查看
生成器(Generator)是Python中的一类特殊对象,如果一个函数中出现一次或多次yield表达式,那么这个函数就是一个生成器。
生成器的特点是:
调用生成器时,函数体并没有执行
调用生成器时,返回的是一个特殊的迭代器对象,这个迭代器对象封装了生成器的函数体、本地变量和当前执行点;
当生成的迭代器的next()方法被调用时,被封装的函数体执行到下一个yield的位置,
执行 yield 语句时,返回 yield 后面的表达式作为next()方法的返回值,然后把执行状态保存起来。下一次再执行 next() 方法时,函数体继续执行到下一个yield语句
函数体执行结束或遇到 return 语句,则生成器抛出异常StopIteration,然后迭代过程结束
生成器中的 return 语句不能带有表达式
生成器对比返回列表的函数:
每次执行才返回需要的结果,比一次将所有结果放在列表中返回更节省空间
如果需要同时传入所有的元素,则需要使用列表
例1. 一个生成器的例子
生成器表达式
生成器表达式(generator expression)和列表推导式(list comprehension)具有非常类似的结构,列表推导式是使用方括号[]表示生成一个列表,而生成器表达式则是使用圆括号()返回一个一次产生一个值的生成器:
例:生成器表达式与列表推导式
显然,生成器表达式兼具列表推导式的简洁的优点,还能节省内存。
生成器的特点是:
调用生成器时,函数体并没有执行
调用生成器时,返回的是一个特殊的迭代器对象,这个迭代器对象封装了生成器的函数体、本地变量和当前执行点;
当生成的迭代器的next()方法被调用时,被封装的函数体执行到下一个yield的位置,
执行 yield 语句时,返回 yield 后面的表达式作为next()方法的返回值,然后把执行状态保存起来。下一次再执行 next() 方法时,函数体继续执行到下一个yield语句
函数体执行结束或遇到 return 语句,则生成器抛出异常StopIteration,然后迭代过程结束
生成器中的 return 语句不能带有表达式
生成器对比返回列表的函数:
每次执行才返回需要的结果,比一次将所有结果放在列表中返回更节省空间
如果需要同时传入所有的元素,则需要使用列表
例1. 一个生成器的例子
def updown(n): for x in xrange(1, n): yield x for x in xrange(n, 0, -1): yield x for i in updown(5): print i , 1 2 3 4 5 4 3 2 1
生成器表达式
生成器表达式(generator expression)和列表推导式(list comprehension)具有非常类似的结构,列表推导式是使用方括号[]表示生成一个列表,而生成器表达式则是使用圆括号()返回一个一次产生一个值的生成器:
例:生成器表达式与列表推导式
>>> l = range(1,10) >>> l [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> [x*x for x in l] #列表推导式 [1, 4, 9, 16, 25, 36, 49, 64, 81] >>> (x*x for x in l) # 生成器表达式 <generator object <genexpr> at 0x000000000224E288>
显然,生成器表达式兼具列表推导式的简洁的优点,还能节省内存。
相关文章推荐
- python基础入门之简单爬虫编写
- python发送电子邮件
- python文本文件,生成指定的文件格式
- python 找出空闲的端口 5个平台 利用 socket 或 netstat 查看端口是否被占用
- Mac下vim有关python编程的简单配置
- Top 3000+ Python Modules
- Python 3.4 学习总结(1)
- python 当list,dic作为默认参数的正确写法
- Python中的弧度转化以及三角函数
- python3使用ltp语言云
- python 正则表达式
- 自学perl 系列1
- 理解Python中的With语句
- Python快速实现文件共享
- Python基础教程笔记——第7章:更加抽象(类)
- ubuntu下Python虚拟环境的安装、激活、退出
- python datatime
- python_random随机
- win10如何安装python?win10安装python图文教程
- python实现下载指定网址所有图片的方法