Python之yield详解

举报
Python爱好者 发表于 2020/12/30 00:37:51 2020/12/30
【摘要】 今天小编给大家带来的是Python教程之yield,好多新人跟小编反应这个东西不懂,而且网上也没找到足够简单的教程,小编回复了大家之后觉得很有必要将yield讲一下。 在讲yield之前必须明确两个概念,什么是迭代器,什么是生成器。那我们先来熟悉这两个概念,再去看yield。 迭代器(iterator) 关于迭代这个概念我们应该并不陌生,之前在for循环里有说...

640?wx_fmt=gif

今天小编给大家带来的是Python教程之yield,好多新人跟小编反应这个东西不懂,而且网上也没找到足够简单的教程,小编回复了大家之后觉得很有必要将yield讲一下。

在讲yield之前必须明确两个概念,什么是迭代器,什么是生成器。那我们先来熟悉这两个概念,再去看yield。

迭代器(iterator

关于迭代这个概念我们应该并不陌生,之前在for循环里有说过,那我们现在来回顾一下:

640?wx_fmt=png

对于skills这样的一个列表集合,需要将里面的所有元素输出,我们可以通过for循环对skills进行迭代(就是对skills进行循环),skills就是迭代对象(循环对象),那迭代器是什么呢?

创建一个容器(随便是什么数据结构,只要能循环,例如列表,元组,字符串,字典等等),它里面的所有元素可以通过for语句依次循环取出每一个元素,这种容器就是迭代器了。

(仔细掂量掂量这句话,好好在脑袋里转转!)

生成器(generator

刚刚我们说了迭代器,现在我们来解释一下生成器。创建迭代器有三种方法(这里我们不予讨论,感兴趣的同学可以看看前两个,分别是__iter__() 和__next__() 方法&内置函数 iter()),这第三个方法就是生成器。

生成器如何生成迭代器的呢?

很简单,就一个关键字,也就是我们今天要讨论的主题yield,那下面我们先来看一段代码:

640?wx_fmt=png

小编在这里编写了一个函数,做的是斐波那契数列,在这里采用了关键字:yield,那我们就来看看yield这个东西究竟到底TM是何方神圣!

首先我们再来看另一个函数:

640?wx_fmt=png

我们来看看,这两个函数有什么不同,经过大家抠着眼睛仔细观察,我们发现:除了一个是yield b,一个是print(b),其他并没有什么不同!

OK,那我们进入下一步,将这两个函数拿出来看看,看看他们到底有啥不一样!

(这里我们引入type()函数,就是专门用来判定某个数据的类型的,只要将需要判定的数据放入type后面的括号里即可)

那我们来执行一下这两个函数的类型,那我们来执行并看一下结果:

640?wx_fmt=png

输出:

640?wx_fmt=png

我们很明显的看到了区别,fab2函数仅仅作为一个自定义函数在执行结果的时候是NoneType的,只有type(fab2)时才会输出:

640?wx_fmt=png

那此时,有yield的函数呢,它的执行结果类型为generator,也就是说他变成了生成器!!!

仅仅一个单词的差别就改变了他们根本的属性!yield的存在使得fab这个函数永久变成了生成器!

这就是生成器。

 

Yield

 

那下面我们来讲yield本身吧!既然它有这么大的本领,那我们得应该知道如何驾驭它吧!

首先,我们看一个简单的函数:

640?wx_fmt=png

这是一个很神奇的函数:里面除了yield其他什么都没有,那我们尝试将里面的元素都取出来,那我们现在直接执行这个函数:

640?wx_fmt=png

输出:

640?wx_fmt=png

我们发现直接执行这个函数会显示它是generator object 没法输出,那既然它是generator,那我们就迭代输出啊!

640?wx_fmt=png

输出:

640?wx_fmt=png

OK,结果顺利输出!

那我们现在再回到fab函数,对于这样的一个函数我们应该如何执行输出???

请…….

思…….

考…….

片…….

刻…….

640?wx_fmt=png

输出:

640?wx_fmt=png

正确输出斐波那契的前六次结果!

到此为止,我们现在一个了解yield是个什么东西(能是函数变成迭代器),以及怎么使用它了(需要迭代输出)。

 

下期见!



听说有气质的人都会关注这个公众号!

640?wx_fmt=jpeg


文章来源: blog.csdn.net,作者:敲代码的灰太狼,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/tongtongjing1765/article/details/100581672

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。