文档章节

零基础学python-19.6 生成器函数应用

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 533
阅读 1
收藏 0

这一章节我们来讨论一下生成器函数应用。

先定义一个生成器函数:

>>> def test():
	for x in range(3):
		yield x

		
>>> test()
<generator object test at 0x00BBF378>

从上面的代码可以看见,函数test返回的是一个生成器,然后当生成器产生一个结果之后,控制权就会返回给函数,然后系统会记录函数当前的状态(作用域与变量)

下面,我们来看看执行代码:

>>> def test():
	for x in range(3):
		yield x

		
>>> x=test()
>>> next(x)
0
>>> next(x)
1
>>>

从执行的代码可以看见,他每次生成一个结果,就会终止生产,然后把控制权交回给函数,然后等待下一次的调用

由于生成器支持迭代协议,因此我们可以使用内建函数next()或者__next__来读取里面的值,当出现StopIteration异常时,生成器会自动回收。

>>> def test():
	for x in range(3):
		yield x

		
>>> x=test()
>>> next(x)
0
>>> next(x)
1
>>> x.__next__
<method-wrapper '__next__' of generator object at 0x01E69260>
>>> x.__next__()
2
>>> x.__next__()
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    x.__next__()
StopIteration
>>>

在之前的章节当中我们提到一些建立列表的例子例如:

>>> def test(N):
	res=[]
	for x in range(N):
		res.append(x**2)
	return res

>>> test(4)
[0, 1, 4, 9]
>>>

除了使用for之外,我们还提到使用列表解析与map来解决这个问题

>>> [x**2 for x in range(4)]
[0, 1, 4, 9]
>>> list(map(lambda x : x**2,range(4)))
[0, 1, 4, 9]
>>>

我们上面的代码都是很快就可以生成结果出来,但是,如果当处理里面的对象需要花费大量的时间,而且不必一次性处理所有对象,这个时候yield这种延迟生成就具备很大的意义了。


总结:这一章节讨论了生成器函数的一些应用,以及主要的应用场景。


这一章节就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录


版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/48850451

共有 人打赏支持
raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
Python基础总结成千行代码,让Python入门更简单!

只要学会这千行代码,不管你是零基础还是弱基础或是没有接触过编程,都可以快速入门Python!当时我就不信邪啊,等我看完之后,即使作为一个Python老鸟了,还是领会到了很多教授他的独特见解!...

糖宝lsh
09/10
0
0
《Python有什么好学的》之生成器/迭代器

“Python有什么好学的”这句话可不是反问句,而是问句哦。 主要是煎鱼觉得太多的人觉得Python的语法较为简单,写出来的代码只要符合逻辑,不需要太多的学习即可,即可从一门其他语言跳来用P...

煎鱼不可能有BUG
11/07
0
0
基于编程人员Python学习第一章节

基于廖雪峰的python零基础学习后,自我总结。适用于有一定基础的编程人员,对我而言,则是基于.net已有方面,通过学习,记录自我觉得有用的地方,便于后续回顾。 主要以快速定位内容,通过直...

Aikenwu
08/13
0
0
python(六)切片,生成式,生成器,迭代

有了前面的基础,其实掌握的比较扎实的话还是能够做出一些简单的东西的,至少解决一些个基本的数学题还是问题不大,比如说实现一个斐波那契数列,杨辉三角什么的。多数情况下使用循环 for .....

Koma
2015/01/20
0
0
Python函数式编程指南(四):生成器

生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。 这是函数式编程指南的最后一篇,似乎拖了一...

fjie
2013/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

phpstorm xdebug 配置

xdebug方便了调试代码,比起一个一个地方的打印结果还是debug看的更明白下面介绍下maxOS系统下的debug配置 下载 https://xdebug.org/download.php 点击红线部分进入,粘贴phpinfo()信息推荐适...

被猪拱了的JAVA
24分钟前
2
0
Golang学习笔记(1)

基本知识 golang的文件格式以go结尾。 运行方式 go run main.go 用于开发调试使用 编译成二进制文件 go build main.go 会生成一个可执行的二进制文件 变量 变量定义的形式 Golang的变量定义有...

ExtreU
38分钟前
1
0
基于Kafka构建事件溯源模式的微服务

概要 本文中我们将讨论如何借助Kafka实现分布式消息管理,使用事件溯源(Event Sourcing)模式实现原子化数据处理,使用CQRS模式(Command-Query Responsibility Segregation )实现查询职责...

架构师springboot
45分钟前
1
0
git上传项目步骤

https://blog.csdn.net/m0_37725003/article/details/80904824

fame_yao
45分钟前
1
0
NOOBS自定义安装多系统

一、预置条件: 宿主系统是win10_x64 virtual box 虚拟机,安装了centos7 树莓派的系统安装工具:NOOBS_v2_9_0.zip,镜像文件 二、根据镜像文件生成boot.tar.xz 和root.tar.xz 1、设置共享目...

mbzhong
56分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部