索引

转载部分内容来自:http://www.jianshu.com/p/d09778f4e055 [彻底理解yield]

http://blog.csdn.net/haskei/article/details/54908853 [深入理解yield]

简要

yield是生成器中的一个关键字,他的作用和返回差不多,但是又有很大的区别:

1.下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行

2.简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。

3.第一次调用时必须先next()或send(None),否则会报错,send后之所以为None是因为这时候没有上一个yield。可以认为,next()等同于send(None)。

 ----next()和send(None)会是生成器函数执行一遍,然后到yield的地方停下,下一次使用next(),send(None)时,从这个地方开始

4.send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。

------猜测next()和send(None)会设置一个开始点

------比如函数中有一个yield赋值,a = yield 5,第一次迭代到这里会返回5,a还没有赋值。第二次迭代时,使用.send(10),那么,就是强行修改yield 5表达式的值为10,本来是5的,那么a=10

------猜测send(n)时 x = yield y 的值就是本次send的值,也就是x=n!

实践

1.初步理解

def yii(arr):
    for i in arr:
        yield i+1

arr = [1,2,3,4]

for n in yii(arr):
    print(n)

显示结果:

2
3
4
5

2.次级理解

def shengcheng():
    print('循环前')
    for i in range(5):
        print('第一步',i)
        yield i
        print('第二步:',i)
        yield i
        print('第三步',i)
        yield i

s = shengcheng()
res = s.send(None)
print('sendNone结束\r\n')

#yield也会结束这个循环,所以得把range(n)的n设大一点5*3
for x in range(15):
    res = next(s)
    print('结束并return:', res,'\r\n')

显示结果如下:

D:\Lio\Python\PyInstall\python.exe D:/Servers/Python/dm04_test_send.py
Traceback (most recent call last):
  File "D:/Servers/Python/dm04_test_send.py", line 17, in <module>
    res = next(s)
StopIteration
循环前
第一步 0
sendNone结束

第二步: 0
结束并return: 0 

第三步 0
结束并return: 0 

第一步 1
结束并return: 1 

第二步: 1
结束并return: 1 

第三步 1
结束并return: 1 

第一步 2
结束并return: 2 

第二步: 2
结束并return: 2 

第三步 2
结束并return: 2 

第一步 3
结束并return: 3
......省略......

Process finished with exit code 1

循环与yield的图解

深入浅出理解yield的更多相关文章

  1. Python天天美味(25) - 深入理解yield

    Python天天美味(25) - 深入理解yield - CoderZh - 博客园 Python天天美味(25) - 深入理解yield   yield的英文单词意思是生产,刚接触Python的时候 ...

  2. 深入浅出理解c++虚函数

    深入浅出理解c++虚函数   记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发 ...

  3. 深入理解yield(三):yield与基于Tornado的异步回调

    转自:http://beginman.cn/python/2015/04/06/yield-via-Tornado/ 作者:BeginMan 版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须 ...

  4. [原译]实现IEnumerable接口&理解yield关键字

    原文:[原译]实现IEnumerable接口&理解yield关键字 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢 ...

  5. Python 深入理解yield

    只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: for 取出alist的每一项,然后把i + 1塞进去.然后通过调用取出每一项: = [1, 2, 3, 4]for x in ...

  6. 深入理解yield(转)

    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法.只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist(a ...

  7. Python并发编程之深入理解yield from语法(八)

    大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...

  8. [Python学习笔记-005] 理解yield

    网络上介绍yield的文章很多,但大多讲得过于复杂或者追求全面以至于反而不好理解.本文用一个极简的例子给出参考资料[1]中的讲解,因为个人觉得其讲解最为通俗易懂,读者只需要对Python的列表有所了解 ...

  9. 深入理解yield(二):yield与协程

    转自:http://blog.beginman.cn/blog/133/ 协程概念 1.并发编程的种类:多进程,多线程,异步,协程 2.进程,线程,协程的概念区别: 进程.线程和协程的理解 进程:拥有 ...

随机推荐

  1. Office 365开发环境概览

    本文于2017年3月26日首发于LinkedIn,原文链接请参考这里 本系列文章已经按照既定计划在每周更新,此前的几篇文章如下 Office 365 开发概览系列文章和教程 Office 365开发概 ...

  2. Brackets--我的初恋编辑器

    大学毕业以后,因为一些个人琐事没有找到自己专业的对口工作,整天混混沌沌得过着也没有打破现状的决心和机会.但是每当独自思考的时候总是一阵阵的害怕,怕自己从此一事无成一无所有.于是在某个心潮澎湃的瞬间开始 ...

  3. Struts2.5简单使用入门

    今天学了Struts2.5最新版的,老师在黑板上讲的很是简单,也很是容易,简单的就实现了.可是课下让我们自己弄,自己无论如何都无法运行成功,一直提示404.偶然间灵机一动,改了一下那个文件就好了.希望 ...

  4. HTML5 的WebSocket

    认识HTML5的WebSocket

  5. Java基础之J2EE规范

    什么是J2EE? 在企业级应用中,都有一些通用企业需求模块,如数据库连接,邮件服务,事务处理等.既然很多企业级应用都需要这些模块,一些大公司便开发了自己的通用模块服务,即中间件.这样一来,就避免了重复 ...

  6. [深入学习Redis]RedisAPI的原子性分析

    在学习Redis的常用操作时,经常看到介绍说,Redis的set.get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的? 原子性 原子性是数据库的事务中的 ...

  7. [原]C#与非托管——封送和自动封送

    之前说到了如何从C函数声明通过简单的查找替换生成一份C#的静态引用声明(C#与非托管——初体验),因为只是简单说明,所以全部采用的是基础类型匹配和自动封送.自动封送虽然能省去我们不少编码时间,但如果不 ...

  8. python 爬取w3shcool的JQuery的课程并且保存到本地

    最近在忙于找工作,闲暇之余,也找点爬虫项目练练手,写写代码,知道自己是个菜鸟,但是要多加练习,书山有路勤为径.各位爷有测试坑可以给我介绍个啊,自动化,功能,接口都可以做. 首先呢,我们明确需求,很多同 ...

  9. Vue.js 学习笔记 一

    本文的Demo和源代码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或在GitHub上加个星星! https://github.com/zwl-jasmine95/Vue_test 以下所有知 ...

  10. 转接口IC NCS8807:LVDS转MINI LVDS芯片

    LVDS 4K TCON w/ Scaler1 General Description    NCS8807 is an LVDS 4K TCON with advanced scaling func ...