首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

零基础学习 Python 之初识生成器

本文字数:1946 字

阅读本文大概需要:5 分钟

写在之前

昨天的文章中(

Python 拓展之迭代器

)我们学了「迭代器」,今天我们就来学学另一个 -- 「生成器」。如果不出意外的话,「生成器」这个部分是我们在“类”里面的最后一个知识点,坚持就是胜利。

生成器

不知道你还记得么,在昨天出现了一个单词我们还没说:

就是上面那个 generator,现在我可以告诉你了,generator 翻译成中文就是“生成器”。

在 Python 中,定义生成器必须要使用 yield 这个关键词,yield 翻译成中文有「生产」这方面的意思。在 Python 中,它作为一个关键词,是生成器的标志。接下来我们来看一个例子:

上面是写了一个很简单的 f 函数,代码块是 3 个 yield 发起的语句,下面让我们来看看如何使用它:

上述操作可以看出,我们调用函数得到了一个生成器(generator)对象。

在上面我们看到了 __iter__() 和 __next__(),虽然我们在函数体内没有显示的写 __iter__() 和 __next__(),仅仅是写了 yield,但它就已经是「迭代器」了。既然如此,那我们就可以进行如下操作:

从上面的简单操作可以看出:含有 yield 关键词的函数 f() 是一个生成器对象,这个生成器对象也是迭代器。所以就有了这样的定义:把含有 yield 语句的函数称为生成器,生成器是一种用普通函数语法定义的迭代器。

通过上面的例子可以看出,这个生成器(即迭代器)在定义的过程中并没有昨天讲的迭代器那样写 __iter__(),而是只用了 yield 语句,之后一个普普通通的函数就神奇的成了生成器,同样也具备了迭代器的特性。

yield 语句的作用,就是在调用的时候返回相应的值。下面我来逐行的解释一下上面例子的运行过程:

1.fa = f():fa 引用生成器对象。

2.fa.__next__():生成器开始执行,遇到了第一个 yield,然后返回后面的 0,并且挂起(即暂停执行)。

3.fa.__next__():从上次暂停的位置开始,继续向下执行,遇到第二个 yield,返回后面的值 1,再挂起。

4.fa.__next__():重复上面的操作。

5.fa.__next__():从上次暂停的位置开始,继续向下执行,但是后面已经没有 yield 了,所以 __next__() 发生异常。

写在之后

在上面的一系列操作中,不知道你有没有发现,yield 除了作为生成器的标志以外,还有一个「返回值」的功能。我们知道 return 也有这个功能,那么它跟 return 的这个返回值有什么区别呢?这个你可以先思考一下,我之后的文章会详细的写一下 yield,敬请期待。

如果你觉得本篇文章对你有所帮助,欢迎点赞转发,让更多的人看到。如果你有什么问题或者建议欢迎联系我。

The end。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180830A09SZ800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券