1 yield 在使用send, next时候的区别(举例m = yield 5)

  无论send,next首先理解m = yield 5 是将表达式"yield 5 "的结果返回给m, 而不是m=5这么简单, 所以涉及到如何获取表达式yield 5的值,这就和next,send有关。

  当send(arg)时,就会将arg 认为yield 5表达式的结果赋给m,而如果是next,就会将None作为yield 5表达式的结果付给m;

  所以可认为next 等效于send(None),除了第一次next外

  

  区别就是:

    使用next()时,第一次next, 在遇到yield停止,并且将yield右边的表达式“5”作为next函数的返回值返回给外界; 之后的next,会将None作为yield 5表达式的值赋给m,

    程序往下执行,遇到下一个yield时,将yield右边的表达式5作为该次的next的返回值

    使用send(arg)时(前面必须已经使用了next), 将arg作为yield表达式"yield 5"的值,赋给m;程序往下执行,然后将下个yield的右边表达式"5"作为send函数的返回值 

  

  next例子:

def f():
print("start")
current = yield "hello"
print('current=', current)
while True:
value = yield "bad"
# value = value + 'not' # 此行会报错,因为value会为None, 不能和字符串进行相加 g = f()
s1 = next(g)
print('s1=',s1)
# 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值 s2 = next(g)
print('s2=', s2)
# 第二次的next,会将None作为yield表达式" yield hello"的值赋给current, 即current = None
# 然后程序往下执行,遇到yield "bad"停止,将yield右边的表达式"bad"作为第二次next的返回值 s3 = next(g)
print('s3=',s3)
# 第三次next,会将None作为yield表达式”yield bad"的值赋给value, 即value = None,
# 程序往下执行,遇到value = yield "bad"停止,将"bad"作为第三次next的返回值

  send例子:

def f():
print("start")
current = yield "hello"
print('current=', current)
while True:
value = yield "bad"
print("value=",value)
# value = value + 'not' # 此行会报错,因为value会为整形, 不能和字符串进行相加 g = f()
s1 = next(g)# 这一步不能少
# 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值
print(g.send(10))
# 生成器调用第一次send时,将send参数10代替表达式"yield hello"的值,赋给current,
# 然后程序往下执行,在遇到yield bad停止,将"bad"作为第一次send()函数的返回值返给外界
print(g.send(20))
# 生成器第二次调用send时,将send参数20代替表达式"yield bad"赋给 value
# 程序往下执行,然后遇到yield bad停止,将"bad"作为第二次send()函数的返回值返给外界

   

2 yield与生成器generator

  函数里面使用了yield不再是函数,而是一个生成器generator。 比如

def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
# print b
a, b = b, a + b
n = n + 1

  当执行g = fab(5)时,不是调用函数,而是实例化一个生成器对象。 当循环g对象或者next(g)时才会调用fab函数里面的代码

def test():
# print('one')
yield 1
# print('two')
yield 2 g = test()
for i in g:
print(i) # 应该和下面效果是一样的:
g = test()
res = next(g)
print(res)
# 首次遇到next()会执行test代码,并停留在yield 1 处,
# 同时将yield 后面表达式的值作为next的返回值返回给外界
#
res = next(g)
print(res)
# 接着上面保存的地方,运行print two,
# 碰到yield 2 ,停止并把后面的2作为Next的返回值返回给外界

3 生成器是有状态的,调用者不可反复使用它。比如:

def test():
yield 1
yield 2 g = test()
for i in g:
print(i) # 下面这里是没有效果的
for i in g:
print('hello')
print(i)

  

[oldboy-django][4python面试]有关yield那些事的更多相关文章

  1. 作为java应届生,面试求职那点事

    找工作两星期多了.心情不爽,写点记录打发时间. 嘘~~自己的破事:  刚毕业,也过了实习,本理所应当的留在公司转正.可是为了谈了两年的女朋友回家见面.一切都顺利进行,妈妈也开心给了一万见面礼,一切都以 ...

  2. 在Django中Session的那点事!

    1.session是什么 首先引入度娘的解释:Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 We ...

  3. [oldboy-django][4python面试]面试前需要熟练掌握的知识点(待更新)

    python基础 - 生成器 - 装饰器 - 迭代器 - 列表生成式 - 引用,传参 - 面向对象,继承 前端Html: - 词法分析 - 作用域 - 语法分析 - this - Jsonp mysq ...

  4. [oldboy-django][4python面试]有关csrf跨站伪造请求攻击

    1 csrf定义 - csrf定义:Cross Site Request Forgery,跨站请求伪造 举例来说: 网站A伪造了一个图片链接: <a href="http://www. ...

  5. [oldboy-django][4python面试]cookie和session比较

    session定义(知乎网上) Session的数据不是储存在客户端上的,而是储存在服务器上的:而客户端使用Cookie储存一个服务器分配的客户端会话序号(Session ID),当客户端请求服务器时 ...

  6. 突然心血来潮,想写写我在java面试中遇到的事。作为一个应届生,我觉得我的情况都与大部分应届生是差不多的,希望你们能在这上面得到一些有用的

    面试过程吧,怎么说呢?从一开始接触面试到现在成功了几家,这中间我确实收获了许多,那我就从我第一次面试开始讲吧. 第一次面试是有人介绍过来的,总之还是有一位贵人相助,所以第一次面试时,面试官很好没有怎么 ...

  7. 关于localStorage面试的那点事

    最近面试的时候关于html5API总会被问到localStorage的问题, 对于一般的问题很简单,无非就是 localStorage.sessionStorage和cookie这三个客户端缓存的区别 ...

  8. 聊一聊FE面试那些事

    聊一聊FE面试那些事 最近公司由于业务的扩展.技术的延伸需要招一批有能力的小伙伴加入,而我有幸担任"技术面试官"的角色前前后后面试了不下50多位候选人,如同见证了50多位前端开发者 ...

  9. 聊一聊FE面试那些事【原创】

    最近公司由于业务的扩展.技术的延伸需要招一批有能力的小伙伴加入,而我有幸担任"技术面试官"的角色前前后后面试了不下50多位候选人,如同见证了50多位前端开发者的经历一样,在面试的过 ...

随机推荐

  1. co-dialog弹出框组件-版本v2.0.1

    具体案例查看co-dialog:https://koringz.github.io/co-dialog/index.html 2.0.1版本优化项,代码压缩,修复PC和移动端自适应,修复显示弹出框浏览 ...

  2. bzoj2600 [Ioi2011]ricehub

    Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ...

  3. python剑指offer 链表中环的入口节点

    题目: 一个链表中包含环,请找出该链表的环的入口结点. 思路: 先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发, fast一次走2步,slow一次走一步,如果该链表有环,两个指 ...

  4. IE脚本调试

    打开IE -- 工具 -- Internet选项 -- 高级 --有4项. 1.禁用脚本调试(Internet Explorer)(去掉对勾) 2.禁用脚本调试(其他)(去掉对勾) 3.显示每个脚本错 ...

  5. Vue源码学习一 ———— Vue项目目录

    Vue 目录结构 可以在 github 上通过这款 Chrome 插件 octotree 查看Vue的文件目录.也可以克隆到本地.. Vue 是如何规划目录的 scripts ------------ ...

  6. java面向对象思想2

    1.主函数是一类特殊的函数,作为程序入口,可被虚拟机调用.主函数格式是固定的.public:函数访问权限最大.static:代表函数随着类的加载已经存在.void:主函数没有具体返回值.main:不是 ...

  7. gulp的常用插件

    gulp和webpack的差别:https://www.cnblogs.com/lovesong/p/6413546.html var gulp = require('gulp'); var del ...

  8. 项目十八-Hadoop+Hbase分布式集群架构“完全篇”

    本文收录在Linux运维企业架构实战系列 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建,操作完成后整理的个人心得,分享给大家~~~ 1.认识Hadoop和Hbase 1.1 hadoop简 ...

  9. 3.Cisco Packet Tracer中关于交换机端口安全的设置

    本次实验将在这幅拓扑图的基础上完成 我们会对pc0在交换机上进行mac地址绑定,pc1访问时则交换机断开端口 1.为pc机配置ip地址 pc0:192.168.1.1 pc1:192.168.1.2 ...

  10. linux批量替换

    sed -i "s/李三/李四/g"  -r result/*       将result文件夹下的所有文件中的李三替换成李四 sed命令下批量替换文件内容  格式: sed -i ...