阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结:

通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist

= [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。

生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in

range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。

我理解的生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。可以用上面的mygenerator测试。

带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。

yield 是一个类似 return

的关键字,迭代一次遇到yield时就返回yield后面的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行。

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

带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数,只要这个函数的参数允许迭代参数。比如array.extend函数,它的原型是array.extend(iterable)。

send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。——换句话说,就是send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,a

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

send(msg)与next()都有返回值,它们的返回值是当前迭代遇到yield时,yield后面表达式的值,其实就是当前迭代中yield后面的参数。

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

yield简单说来就是一个生成器,生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

生成器是一个函数,

函数的所有参数都会保留,

第二次调用此函数时,

使用的参数是前一次保留下的。

生成器还“记住”了它在流控制构造。

生成器不仅“记住”了它数据状态。 生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。

yield生成器的运行机制

当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行。 当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复直至退出函数。

例子:Python 排列,组合生成器

生成全排列def perm(items, n=None):

if n is None:

n = len(items)

for i in range(len(items)):

v = items[i:i+1]

if n == 1:

yield v

else:

rest = items[:i] + items[i+1:]

for p in perm(rest, n-1):

yield v + p

生成组合def comb(items, n=None):

if n is None:

n = len(items)

for i in range(len(items)):

v = items[i:i+1]

if n == 1:

yield v

else:

rest = items[i+1:]

for c in comb(rest, n-1):

yield v + c

a = perm('abc')

for b in a:

print b

break

print '-'*20

for b in a:

print b

结果如下:102 pvopf006 ~/test> ./generator.py

abc

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

acb

bac

bca

cab

cba

可以看到,在第一个循环break后,生成器没有继续执行,而第二个循环接着第一个循环执行。

yield在python中是什么意思_python中的yield代表什么相关推荐

  1. python中赋值语句的作用_python中return可以使用赋值语句吗?

    在python中,有各种不同类型的语句.一个python程序是由模块构成的;一个模块由一条或多条语句组成;每个语句由不同的表达式组成;表达式可以创建和操作对象.下面来看看python中的语句. 赋值语 ...

  2. python 面试生成器和迭代器_Python 中的迭代器与生成器

    导读 这篇文章主要介绍了 python 当中的迭代器与生成器,在涉及到大数量的场景应该考虑使用迭代器与生成器. 原文链接: https://russellgao.cn/python-iter/ 可迭代 ...

  3. python中函数的作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  4. python列表怎么写文件_python中以字典为元素的列表怎么写入文本文件

    python如何将列表中的元素添加进字典纵然被命运的铁蹄狠狠践踏,也顽强地长出自己的根芽. 录入自己和另一个人的名字的汉语拼音简写,然后依据标识符中字母的数值两个人,一颗心,依偎的不是爱情而是那小温暖 ...

  5. python中round函数参数_python中关于round函数的小坑

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

  6. python里的join方法_python中join()方法介绍

    描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str . join ( sequence ) 参数 sequence -- ...

  7. python常用函数的用法_python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object):""&qu ...

  8. python中反斜杠_Python中的正斜杠/与反斜杠\

    知识点: 1. "/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠 2. 对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠\. ...

  9. python中的元类_Python中的元类(metaclass)

    提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理 ...

  10. python中end 1 意思_python中“end=”是什么意思?_后端开发

    c语言fopen函数的用法_后端开发 在c语言中可以使用"fopen()"函数打开一个文件,该函数用于打开一个文件,其语法是"open("file a" ...

最新文章

  1. 在 .NET 框架程序中通过DllImport使用 Win32 API
  2. python爬虫图片实例-【图文详解】python爬虫实战——5分钟做个图片自动下载器...
  3. 处女座与cf(思维题)
  4. uva 1557 - Calendar Game(博弈)
  5. 自定义拦截器用于用户登录的
  6. 如何在WhatsApp中将群聊静音
  7. 在MySQL数据库建立多对多的数据表关系
  8. python中时间模块
  9. 下月上市!中兴AXON 10 Pro 5G版通过3C认证 加入5G大战
  10. java并发编程实战学习(3)--基础构建模块
  11. asp.net 两个控件放一行_思维导图?试试这两个宝藏网站吧
  12. 两种方案的demo示例
  13. angular input_更快的Angular应用程序
  14. 常用Git客户端:Tower for Mac
  15. gpu云服务器运行游戏_99元起!华为云鲲鹏云手机正式发布:流畅运行大型游戏...
  16. 翻译: 漫画HTTPS原理二 了解对称和非对称加密
  17. LockSupport类中的park()和unpark()
  18. 数商云汽车经销商管理系统解决方案:构建消费者、经销商企业功能体系
  19. C++模拟鼠标键盘操作(转)
  20. 湘潭大学 计算机学院程诗婕,2019 CCF CCSP分赛区竞赛决出金银铜奖

热门文章

  1. h5制作导出html,Hype这款H5制作软件的导出功能的详细介绍
  2. 分享一波【一周小结】,望大家支持一下
  3. 拼多多linux版本,拼多多没有Linux版本客户端,但可用xDroid来运行拼多多APP
  4. 计算机义诊暑期社会实践报告,义诊社会实践报告
  5. 云计算就业前景究竟怎样 如何加入云计算行列
  6. openg离线包_OpenGL离线渲染和缓冲区对象
  7. 网易云信短信功能使用
  8. CSS不规则卡片-纯CSS制作优惠券样式-CSS实现锯齿样式
  9. 网站如何设置一个小图标
  10. 网易交互设计师微专业C3 规范信息架构与流程设计