深入浅析Python中的yield关键字

作者:震灵 时间:2022-04-18 05:02:32 

前言

python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield。有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用。

一段代码


def fun():
for i in range(20):
x=yield i
print('good',x)
if __name__ == '__main__':
a=fun()
a.__next__()
x=a.send(5)
print(x)

这段代码很短,但是诠释了yield关键字的核心用法,即逐个生成。在这里获取了两个生成器产生的值,即0和1。分别由next函数和send()函数获得,这两个函数的区别我们后面会详细阐述。

关于__next__函数,这里先说明一下,我们可以利用__next__()这个函数持续获取符合fun函数规则的数,直到19结束。这段代码如下所示:


def fun():
for i in range(20):
x=yield i
if __name__ == '__main__':
for x in fun():
print(x)

这段代码的效果和下面这段代码是完全相同的


if __name__ == '__main__':
for i in range(20):
x=yield i

for..in调用生成器算是生成器的基础用法,不过只会用for..in意义是不大的。生成器中最重要的函数是sent和__next__这两个函数,下面就针对这两个函数进行详细的阐述。

sent函数

这里特别强调了sent函数,因为sent函数没有那么直观。__next__函数很好理解,就是从上一个终止点开始,到下一个yield结束,返回值就是yield表达式的值。

例如在初始的那段代码里:


def fun():
for i in range(20):
x=yield i
print('good',x)

第一次调用__next__函数的时候,我们从fun的起点开始,然后在yield处结束,需要注意的是,赋值语句不会调用,此处yield i和含义和return差不多。

但是第二次调用__next__函数的时候,就会直接从上一个yield的结束处开始,也就是先执行赋值语句,然后输出字符串,进入下一个循环,直到下一个yield或者生成器结束

再次看初始的那段代码,可以发现第二次调用的时候没有选择使用__next__函数,而是使用了一个sent()函数。这里就需要注意,sent()函数的用法和__next__函数不太一样。sent()函数只能从yield之后开始,到下一个yield结束。这也就意味着第一次调用必须使用__next__函数。

sent()函数最重要的作用在于它可以给yield对应的赋值语句赋值,比如上面那一段代码中的

x=yield i

如果调用__next()__函数,那么x=None。但是如果调用sent(5),那么x=5。除了上述将的两个特征以外,sent和next并没有什么区别,sent函数也会返回yield表达式对应的值

next函数调用次可能有限

需要特别注意的是,尽管是生成器。但是next函数的调用次数可能是有限的。比如下面这段代码


def fun():
for i in range(20):
x=yield i
print('good',x)
if __name__ == '__main__':
a=fun()
for i in range(30):
x=a.__next__()
print(x)

生成器里的函数只循环了20次,但是next函数却调用了30次,这时候就会触发StopIteration异常。

总结

以上所述是小编给大家介绍的Python中的yield关键字网站的支持!

来源:http://www.cnblogs.com/zhenlingcn/p/8337788.html

标签:python,yield,关键字
0
投稿

猜你喜欢

  • Rel与CSS的联合使用

    2010-02-20 13:03:00
  • python中logging模块的一些简单用法的使用

    2023-08-12 09:28:17
  • Win10系统提示“Python 0x80070643安装时发生严重错误”怎么办?

    2023-06-13 06:50:25
  • python读取html中指定元素生成excle文件示例

    2021-04-08 19:51:11
  • Python实现识别文字中的省市区并绘图

    2021-10-11 08:14:52
  • Python pandas如何向excel添加数据

    2021-07-14 17:37:41
  • python+selenium实现12306模拟登录的步骤

    2021-06-18 15:32:56
  • 各种 lightbox 实现效果介绍

    2007-11-06 19:16:00
  • 让ASP也支持动态include文件

    2008-05-08 13:00:00
  • js如何能知道浏览者计算机使用的语言是繁体还是简体

    2008-10-09 13:10:00
  • 利用Pytorch实现简单的线性回归算法

    2022-09-08 00:00:09
  • Ubuntu下使用Python实现游戏制作中的切分图片功能

    2021-02-22 22:55:53
  • Python注释、分支结构、循环结构、伪“选择结构”用法实例分析

    2021-01-15 14:45:25
  • 简单谈谈axios中的get,post方法

    2023-10-05 08:47:53
  • Python函数默认参数设置的具体方法

    2021-03-13 08:19:07
  • python使用正则筛选信用卡

    2021-03-10 14:06:47
  • python计算方程式根的方法

    2023-08-09 09:54:47
  • 修改 CentOS 6.x 上默认Python的方法

    2023-08-07 10:02:59
  • Python 获取新浪微博的最新公共微博实例分享

    2021-03-01 13:23:18
  • 如何基于Python爬取隐秘的角落评论

    2022-02-17 05:31:43
  • asp之家 网络编程 m.aspxhome.com