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

写在之前

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

生成器

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

>>> tuple1 = (x**x for x in range(3))

>>> tuple1

<generator object <genexpr> at 0x0000000001DF16D8>

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

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

>>> def f():

...    yield 0

...    yield 1

...    yield 2

...

>>> f

<function f at 0x00000000004EC1E0>

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

>>> fa = f()

>>> fa

<generator object f at 0x0000000001DF1660>

>>> type(fa)

<class 'generator'>

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

>>> dir(fa)

['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__','__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']

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

>>> fa = f()

>>> fa.__next__()

0

>>> fa.__next__()

1

>>> fa.__next__()

2

>>> fa.__next__()

Traceback (most recent call last):

 File "<stdin>", line 1, in <module>

StopIteration

从上面的简单操作可以看出:含有 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,敬请期待。

---------------------------END---------------------------

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
👉 优快云大礼包:gift::[全网最全《Python学习资料》免费赠送:free:!](https://blog.youkuaiyun.com/weixin_68789096/article/details/132275547?spm=1001.2014.3001.5502) (安全链接,放心点击)

若有侵权,请联系删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值