所属网站分类: python基础 > 语句


作者:goodbody

链接: http://www.pythonheidong.com/blog/article/10/

来源:python黑洞网 www.pythonheidong.com

要了解yield它的作用,您必须了解生成器是什么

迭代器

创建列表时,您可以逐个取出元素。逐个读取它的项称为迭代。

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

当您使用列表推导时,您创建一个列表,因此是一个可迭代的:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

在python中你可以使用的所有都是可迭代的; lists,strings,文件...等等

这些迭代很方便,因为您可以根据需要读取它们,但是您将所有值存储在内存中,当您拥有大量值时,这并不总是您想要的。

生成器

生成器是迭代器,是一种只能迭代一次的迭代器。生成器不会将所有值存储在内存中,它们会动态生成值:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

它和迭代器产生的值是相同的,除了你用()而不是[]。但是,由于生成器只能使用一次,所以不能再执行for i in mygenerator:它们计算0,然后打印它并计算1,然后逐个计算4。

yield

yield相当于return,但跟return又有所不同

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

你的函数将返回一组你只需要使用一次的大量值时使用yield它会很方便。

要掌握yield,您必须明白,当您调用该函数时,您在函数体中编写的代码不会运行。该函数只返回生成器对象)

然后,您的代码将从每次for使用生成器时停止的位置继续。

第一次for调用从函数创建的生成器对象时,它将从开始运行函数中的代码直到它遇到yield,然后它将返回循环的第一个值。然后,每个其他调用将再次运行您在函数中写入的循环,并返回下一个值,直到没有值返回。

函数不再被yield,这可能是因为循环已经结束,或者因为你不再满足"if/else"了。

 

yield关键字有什么作用的更多相关文章

  1. 理解 ES6 语法中 yield* 关键字的作用

    在 ES6 中新增了生成器函数的语法,本文解释了与生成器函数有关的 yield* 关键字,及其使用场景. 描述 根据语法规范,yield* 的作用是代理 yield 表达式,将需要函数本身产生(yie ...

  2. 使用yield关键字让自定义集合实现foreach遍历

    一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代 ...

  3. 解析Python中的yield关键字

    前言 python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield.有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用. 一段代码 def fun(): for i i ...

  4. 揭开yield关键字的神秘面纱

    写在前言 经常会看见,python函数中带有yield关键字,那么yield是什么,有什么作用? 答案:可以理解yield是一个生成器: 作用:遇到yield关键字,函数会直接返回yield值,相当于 ...

  5. [PY3]——函数——生成器(yield关键字)

    函数—生成器篇 1. 认识和区分可迭代or生成器 1.1 可迭代对象 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象 当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代 ...

  6. python中的yield关键字

    yield关键字一直困扰了我很久,一直也没有弄明白,现在将暂时理解的yield记录如下,供参考: 关键词:可迭代对象,生成器,迭代器 一.可迭代对象: 可迭代对象:可迭代对象是一个泛称,只要可以用fo ...

  7. C# 中yield关键字解析

    前言 前段时间了解到yield关键字,一直觉得还不错.今天给大家分享一下yield关键字的用法.yield return 返回集合不是一次性返回所有集合元素,而是一次调用返回一个元素.具体如何使用yi ...

  8. php yield关键字以及协程的实现

    php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还 ...

  9. java中关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

随机推荐

  1. Codeforces Round #566 (Div. 2) B. Plus from Picture

    链接: https://codeforces.com/contest/1182/problem/B 题意: You have a given picture with size w×h. Determ ...

  2. Codeforces 1152E(欧拉路径)

    看样例然后发现只要求一个一笔画即可,用板子. #include <cstdio> #include <cstring> #include <iostream> #i ...

  3. Codeforces Round 56-A. Dice Rolling(思维题)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  4. [NWPU2016][寒假作业][正常版第三组]搜索和二分 N

    题意,一条数轴上,告诉你起点和终点,只能向前走1,向后走1,或者走到二倍的现在的位置,每次都耗时一分钟.问从起点到终点的最短时长. 简单地bfs #include <iostream> # ...

  5. NET Core WordPress

    NET Core 上运行的 WordPress 在.NET Core 上运行的 WordPress,无需安装PHP既可跨平台运行WordPress. 在Peachpie中实现PHP所需的功能数月后,现 ...

  6. Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率和决策树多元分类使用.precision方法以precision来评估模型的准确率(图文详解)

    不多说,直接上干货! Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的 ...

  7. HATEOAS REST Service

    用户通过点击页面的href的链接地址,而跳转到其他网页,实现浏览网页的过程了. -> 让调用REST的api就可以实现,类似于用户浏览网页的从一个页面跳转到另外一个页面的过程了 -> 而这 ...

  8. Xamarin.Form的坑

    首先说到xamarin.Forms的安装,简直是坑+坑+坑,为什么呢,有些坑你完全意想不到,比如说你改名字后报错,比如说上份代码能运行,在这里就不能运行,具体先将坑说说吧 坑1 文件名,动不动就报什么 ...

  9. Flat UI theme--扁平化的UI

    项目地址:点击打开 支持版本: jQuery Mobile 1.3.2 使用很简单,前提是你的前端是在jquery-mobile的基础上开发的,然后导入相应的css文件.img文件和js文件即可. 案 ...

  10. java引用数据类型(类)

    1 引用数据类型分类 类的类型分两种 1)Java提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供开发者使用.(类的变量是属性) 2)开发者自己创建的类, ...