Python之yield详解

简介: Python之yield详解

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

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

迭代器(iterator

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


640.png


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

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

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

生成器(generator

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

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

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

640.png

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

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

640.png

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

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

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

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

640.png

输出:

640.png

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

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

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

这就是生成器。

 

Yield

 

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

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

640.png

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

640.png

输出:

640.png

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

640.png

输出:

OK,结果顺利输出!

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

…….

…….

…….

…….

…….


640.png

输出:

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

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

 

下期见!

相关文章
|
2月前
|
存储 Python
Python中的yield到底是个什么鬼?
Python中的yield到底是个什么鬼?
Python中的yield到底是个什么鬼?
|
2月前
|
存储 Python
【Python 3】什么时候使用yield而不是return?
本文讨论了Python中`yield`与`return`的使用场景,解释了`yield`在生成器中的应用,允许函数逐步产生值而不必一次性计算并返回整个序列,适合于节省内存的懒加载场景。
19 2
|
3月前
|
存储 大数据 Python
Python中的yield关键字是什么?
`yield`是Python的关键字,用于创建生成器,实现懒惰计算。生成器函数在遇到`yield`时暂停并返回值,状态得以保留,下次迭代时从中断点继续。生成器是迭代器的一种,常用于处理大数据集或无限序列,避免一次性加载所有数据。例如,`simple_generator`函数通过`yield`逐次返回1, 2, 3。生成器函数如`fibonacci_generator`可用于生成斐波那契数列,而生成器表达式则提供了一种简洁的生成值方式,如`(x**2 for x in range(1, 6))`生成平方数。`yield`还可用于创建无限序列、过滤值(如只生成偶数)和实现懒惰计算
|
4月前
|
Shell Python
Python教程:return和yield的区别
Python教程:return和yield的区别
42 0
Python教程:return和yield的区别
|
4月前
|
Python
Python yield与实现教程分享
Python yield与实现教程分享
28 0
|
4月前
|
Python 微服务
python yield generator 详细讲解
python yield generator 详细讲解
29 0
|
5月前
|
开发工具 Python
Python中return和yield的区别,面试官不讲武德
Python中return和yield的区别,面试官不讲武德
|
5月前
|
Python
Python yield 关键字的作用?
Python yield 关键字的作用?
37 0
|
5月前
|
大数据 Python
Python中的`yield`:掌握生成器的精髓
【4月更文挑战第17天】`yield`在Python中用于创建生成器,一种节约内存的迭代器。生成器函数在迭代时暂停并保存状态,下次迭代时继续执行,适用于处理大数据、实现协程和优化内存。`yield`不同于普通函数,不立即计算所有结果,而是在需要时生成单个值。使用场景包括生成大列表、实现协程和简化迭代逻辑。注意`yield`后的值不能是表达式,生成器只能调用一次,且`yield`与`return`作用不同。理解并善用`yield`能提升Python编程效率。
|
调度 Python
Python上篇:3. Python是如何从yield/send到yield from再到async/await
Python上篇:3. Python是如何从yield/send到yield from再到async/await
下一篇
无影云桌面