鉴于yield关键字的原理大家理解的都不是很深刻,今天我们主要就这一课题进行探讨。

生成器可以用什么方式得到?

方法一:

利用推导式的方式得到生成器# 列表推导式

list1 = [i for i in range(9)]

print(list1)

# 得到生成器

generator = (i for i in range(9))

print(generator)

执行结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8]

at 0x00000151D63DA830>

方式二:

利用函数的方式,用yield得到生成器def generator():

print('代码开始执行了。。。。。。。。')

while True:

response = yield 1

print('-------------------------------')

print('response = ', response)

g = generator()

print(g)

执行结果:

那么我们现在正式来说说这个yield关键字,来解开它的神秘面纱。

从这个程序中大家看到了什么,是不是我们的这个执行结果并不是一个function,而是一个generator,这个就是我们的这个yield关键字的效果,只要我们在函数中使用了yield关键字,那么它不在是一个函数,而是一个生成器。而且,大家还可以看到,我们的这个print语句并没有执行,大家是否有很多问号?

那么这个原因还是和它变成了一个生成器的原因所导致的。生成器一样的会和input函数一样起一个类似的阻塞作用,需要你调用它内部的next方法才会使程序执行一次,当你再一次遇到yield的时候,同样又会停止,那我们来试一下。def generator():

print('代码开始执行了。。。。。。。。')

while True:

response = yield 1

print('-------------------------------')

print('response = ', response)

g = generator()

print(g)

print(next(g))

执行结果:

代码开始执行了。。。。。。。。

1

现在大家看到了什么现象,是不是我们调用了这个next方法之后,代码开始正常执行了,并且给我们返回出了一个1,由此可以证明yield同样还有一个类似于return的功能。但是我们从这个执行结果来看,是不是发现了yield关键字下面的代码没有执行啊?这也就是我说的,遇到了yield就会停止的情况。如果我们现在再去调用一次next方法。def generator():

print('代码开始执行了。。。。。。。。')

while True:

response = yield 1

print('-------------------------------')

print('response = ', response)

g = generator()

print(g)

print(next(g))

print(next(g))

执行结果:

代码开始执行了。。。。。。。。

1

-------------------------------

response =  None

1

那么现在大家发现了没有,我们打印出了三个数据之后又停止了。但是和上面的执行结果对比我们就不难发现,我们第二次调用next方法的时候,并不是自上往下执行的,而是从上一次停止的位置继续执行的,这也就是我们的生成器的特性,它会记住你上一次停留的地方,下次继续从这个地方开始执行。

那好,这是一个现象,大家在看到response = None这块,为什么会出现这么个结果,是不是有同学会纳闷,它的结果不应该是1吗?怎么会是None呢?这里我要告诉大家的是,这个1的结果已经被我们的yield返回出去了,所以这里没有数据,这也是生成器的另一个特征之一,你取出去了这个数据,那么这个数据在生成器里面就不存在了,当你把生成器里的数据取完了,那么它就不能够继续使用了,也就是说生成器只能用一次。

我们再来看第三个现象,最后有一个1是从哪里输出的?它是下一次循环的yield返回出来的,同样到了这里,yield再次将程序阻塞到了这里,知道再次调用next方法或者send方法。

那么看到这里,是不是又有同学们会纳闷了,老师你说的这个next方法我知道,但是这个send方法又是什么东西啊,为什么说send也可以调用这个生成器呢?不急,我们先来写一下这个代码。def generator():

print('代码开始执行了。。。。。。。。')

while True:

response = yield 1

print('-------------------------------')

print('response = ', response)

g = generator()

print(g)

print(next(g))

print(next(g))

print(g.send(2))

执行结果:

代码开始执行了。。。。。。。。

1

-------------------------------

response =  None

1

-------------------------------

response =  2

1

其实对于我们这个send方法,大家应该不难看到,他就是给我们的response传了一个值而已,那么它为什么同样能够调用出我们的生成器呢?那是因为send同样也是在Generator内部的一个方法,它的里面同样封装了next方法,所以我们调用send方法同样也是可以调用到生成器的。并且可以给yield的赋值对象传递一个值。

现在大家对于我们这个yield关键字应该有了深刻的理解了吧?面试官问你,就这么干掉他,你get到了吗?

python生成器yield原理_生成器yield关键字详解相关推荐

  1. python写文件字母_不能错过!详解Python文件读写。

    我:小哥哥,之前的文件操作我不是很懂,能详细讲一下吗? 惨绿青年:既然你诚心诚意地问了,我就大发慈悲告诉你吧. 我:??? 惨绿青年:开个玩笑嘛,眼睛不要瞪这么大. 惨绿青年:文件操作其实很简单,使用 ...

  2. python引用numpy出错_引用numpy出错详解及解决方法

    numpy出错 解决方案 Problem: how to import numpy in subdirectory? Import error of numpy within subfolder. 错 ...

  3. python 中文分析句子成分_语文句子成分分析详解

    现代汉语句子成分分析与讲解 一.主语.谓语 1 .主语 主语可分为名词性主语和谓词性主语. 名词性主语由名词性词语充当, 包括名词. 数词. 名词性的代词短语, 多表示人或事物. 作为被陈述的对象, ...

  4. python编程简单案例_[五组数据]详解一个简单的卡尔曼滤波器python编程实例

    上半年毕设的时候接触了卡尔曼滤波器,用matlab实现了该过程,尝试在一个课后作业中用三维度矩阵来存储变量的方式,结构似乎更好理解,记录一下分析的过程. 假如有一块电阻,你不知道它的阻值是多少,你想 ...

  5. python分析每月销售数据_时间序列ARIMA模型详解:python实现店铺一周销售量预测...

    顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合.这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式.但是是什么令时间序列与常见的回归问题的不同? 有两个原因: 1.时间序 ...

  6. 百钱买百鸡python列表推导式_课时60 数据类型详解-列表-练习题

    练习题 1.使用列表推导式把字典中的键值对转换成key=value的数据格式 ''' 字典{'user':'admin','age':20,'phone':'133'} 列表{'user=admin' ...

  7. python的装饰器迭代器与生成器_python3 装饰器、列表生成器、迭代器、内置方法详解等(第四周)...

    前言: 为什么要学习python3? 原因: 1.学习一门语言能力 2.通过该语言能力完成测试自动化以及独立完成自测框架知识 那么我要做什么呢? 1.每天花十个小时完成python3的学习 要在什么地 ...

  8. python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...

  9. python中导入模块是用哪个关键字_关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...

最新文章

  1. LeetCode实战:二叉树的最大深度
  2. Vsftpd 服务器 问题大全
  3. [Contest20171005]Maze
  4. php中的getdate+函数,PHP中的getdate()函数
  5. 漫画:什么是计数排序
  6. 高等数学复习笔记(四)- 零点问题与微分不等式
  7. [转]PKM-个人知识体系建设
  8. c语言sqart函数格式,2019-07-29 复习C语言入门知识
  9. Oracleji数据库、实例、用户、表空间、表之间的关系
  10. 如何应用SPSS的频率分析,分析数值分布规律
  11. IOS(iPad、iPhone)删除已下载系统更新
  12. 文献阅读(182)Bufferless NoC
  13. SwiftUI是什么,听听大牛们如何说
  14. 计算机主板设置怎么恢复出场设置密码,重做系统或者BIOS的恢复出厂,电脑恢复出厂设置方法(图文)...
  15. 你所表现的负责可能正是在逃避责任
  16. 如何在线将XPS转换成Word文档?
  17. manjaro安装mpv
  18. 鸡兔同笼:已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。
  19. Xilisoft Video Editor(视频编辑软件)v2.2永久版
  20. 08_Influxdb+Grafana监控内存磁盘流量

热门文章

  1. jde多目标_华科开源多目标跟踪(MOT)实时新SOTA:FairMOT
  2. python采用函数式编程模式吗_Python函数与函数式编程
  3. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...
  4. win10 系统怎么获取最高管理员权限删除文件
  5. android应用程序开发_Kotlin与Flutter:Android跨平台应用程序开发,到底选择哪个?...
  6. linux改变工作目录命令,linux命令:cd命令,改变当前的工作目录
  7. 奠定了整个计算机科学的基础是什么,冯 诺依曼对计算机科学发展所作的贡献是什么...
  8. react native与webview通信跳转页面报错:Cannot read property 'setNativeProps' of undefiend
  9. mysql的日期函数以及应用
  10. java数组转换成字符串,附小技巧