今天小编给大家带来的是Python教程之yield,好多新人跟小编反应这个东西不懂,而且网上也没找到足够简单的教程,小编回复了大家之后觉得很有必要将yield讲一下。
在讲yield之前必须明确两个概念,什么是迭代器,什么是生成器。那我们先来熟悉这两个概念,再去看yield。
迭代器(iterator)
关于迭代这个概念我们应该并不陌生,之前在for循环里有说过,那我们现在来回顾一下:
对于skills这样的一个列表集合,需要将里面的所有元素输出,我们可以通过for循环对skills进行迭代(就是对skills进行循环),skills就是迭代对象(循环对象),那迭代器是什么呢?
创建一个容器(随便是什么数据结构,只要能循环,例如列表,元组,字符串,字典等等),它里面的所有元素可以通过for语句依次循环取出每一个元素,这种容器就是迭代器了。
(仔细掂量掂量这句话,好好在脑袋里转转!)
生成器(generator)
刚刚我们说了迭代器,现在我们来解释一下生成器。创建迭代器有三种方法(这里我们不予讨论,感兴趣的同学可以看看前两个,分别是__iter__() 和__next__() 方法&内置函数 iter()),这第三个方法就是生成器。
生成器如何生成迭代器的呢?
很简单,就一个关键字,也就是我们今天要讨论的主题yield,那下面我们先来看一段代码:
小编在这里编写了一个函数,做的是斐波那契数列,在这里采用了关键字:yield,那我们就来看看yield这个东西究竟到底TM是何方神圣!
首先我们再来看另一个函数:
我们来看看,这两个函数有什么不同,经过大家抠着眼睛仔细观察,我们发现:除了一个是yield b,一个是print(b),其他并没有什么不同!
OK,那我们进入下一步,将这两个函数拿出来看看,看看他们到底有啥不一样!
(这里我们引入type()函数,就是专门用来判定某个数据的类型的,只要将需要判定的数据放入type后面的括号里即可)
那我们来执行一下这两个函数的类型,那我们来执行并看一下结果:
输出:
我们很明显的看到了区别,fab2函数仅仅作为一个自定义函数在执行结果的时候是NoneType的,只有type(fab2)时才会输出:
那此时,有yield的函数呢,它的执行结果类型为generator,也就是说他变成了生成器!!!
仅仅一个单词的差别就改变了他们根本的属性!yield的存在使得fab这个函数永久变成了生成器!
这就是生成器。
Yield
那下面我们来讲yield本身吧!既然它有这么大的本领,那我们得应该知道如何驾驭它吧!
首先,我们看一个简单的函数:
这是一个很神奇的函数:里面除了yield其他什么都没有,那我们尝试将里面的元素都取出来,那我们现在直接执行这个函数:
输出:
我们发现直接执行这个函数会显示它是generator object 没法输出,那既然它是generator,那我们就迭代输出啊!
输出:
OK,结果顺利输出!
那我们现在再回到fab函数,对于这样的一个函数我们应该如何执行输出???
请…….
思…….
考…….
片…….
刻…….
输出:
正确输出斐波那契的前六次结果!
到此为止,我们现在一个了解yield是个什么东西(能是函数变成迭代器),以及怎么使用它了(需要迭代输出)。
下期见!