零基础学python-19.6 生成器函数应用
零基础学python-19.6 生成器函数应用
raylee2015 发表于2年前
零基础学python-19.6 生成器函数应用
  • 发表于 2年前
  • 阅读 0
  • 收藏 0
  • 点赞 0
  • 评论 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-目录


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

标签: python
共有 人打赏支持
粉丝 7
博文 265
码字总数 44224
×
raylee2015
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: