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. cms-帖子静态化

    实现帖子静态化和实现友情链接静态化一致, 1.首先建立帖子类别的实体类: package com.open1111.entity; /** * 帖子类别实体 * @author user * */pu ...

  2. 如何查看CRM WebUI,C4C和Hybris里的页面技术信息

    CRM 在WebClient UI页面上按F2,就能看到页面的技术信息, 可以找到当前页面是哪一个BSP component实现的: C4C 在浏览器url里添加debugMode=true,然后按住 ...

  3. 2018.6.12 Oracle问题

    ORA-01950: 对表空间 'USERS' 无权限 创建新的用户时,要指定default tablespace,否则它会把system表空间当成自己的缺省表空间.这样做是不提倡的.估计原来创建某个 ...

  4. 2018.5.19 Oracle数据操作和管理表的综合练习

    --作业一.使用自己的用户登录,完成如下操作,并且创建5条测试数据 -- 创建学生表(stu),字段如下: -- 学号(stuID) -- 姓名(stuName) -- 性别(stuSex) -- 入 ...

  5. c++ bitset 10进制转二进制

    #include <bitset> using namespace std; void main() { int a; cin>>a; cout<<bitset&l ...

  6. oc数组遍历

    #import <Foundation/Foundation.h> //数组遍历(枚举)对集合中的元素依此不重复的进行遍历 int main(int argc, const char * ...

  7. 转载:jsonp详解

    json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩意. 同源策略 首先 ...

  8. linux正则表达式扩展部分

    扩展的正则表达式(Extended  Regular  Expressions): 使用的命令为:grep  -E以及egrep [了解即可] 1)+ 表示重复“一个或一个以上”前面的字符(*是0或多 ...

  9. 【工具】Sublime Text 自动保存功能

    经常需要所以要频繁用到"ctrl+s"保存还是挺麻烦的,所以有的人需要用到失去焦点自动保存功能,这里简单记录下 1.点击"Preferences"里的设置-用户 ...

  10. wampserver怎么设置外网可访问

    wampserver配置httpd.conf允许外网访问? 在电脑上开启wamp服务后,默认是禁止外部网络访问的,如果您想要同一局域网中的设备能够访问PC上的web项目,则需要对httpd.conf文 ...