Python之yield详解

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值