python 斐波那契数列 yield_Python之yield详解

3de7214f2f74ee27125a9268d3edf98d.png

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

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

迭代器(iterator)

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

e7d0b503cf9aad24ecd22af5b20ba11d.png

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

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

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

生成器(generator)

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

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

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

01895b7d729b087572f98736475ebe04.png

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

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

9d46d234d0ba828785b2df3c357ce0bb.png

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

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

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

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

3f5584a65ee691181e158ae512c08f43.png

输出:

87220325c3190fc66624c9ff19716169.png

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

1570d2215763d9d98cef81c3738d6c69.png

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

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

这就是生成器。

Yield

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

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

af5a6f99e4093ae0e5fd1e267415e732.png

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

00eae166a197611d943576192644b4d3.png

输出:

60f2532221f001519202011485cac3ae.png

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

eb03cd07180bee0546eaed05abc0e734.png

输出:

ee0f32adcd5345cf8a27afb688c3dfa7.png

OK,结果顺利输出!

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

请…….

思…….

考…….

片…….

刻…….

c30634e1cb72ec55e432c2b82d9a35a3.png

输出:

b9d127ac27c6aad35b2330adfe6a1324.png

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

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

下期见!

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值