python 中的 yield 究竟为何物?生成器和迭代器的区别?
当你突然看到别人的代码中出现了一个好像见过但又没用过的关键词 比如 yield ,你是否会觉得这段代码真是高大上呢?
或许只有我这种小白才会这样子觉得,就在刚刚,我就看见了别人的代码中的yield,觉得新奇的同时,又感叹自己太无知,但毕竟我也不是那种规规矩矩学写代码的人,遇上不懂的,咱就学咯。
于是先上网易有道词典搜一下这个单词的意思
额。。。那在代码中应该是产生的意思较为准确了。
我尝试在编辑器中使用yield,报错了,说是得再函数中使用
那就来定义一个函数,再调用它好了
def test():
yield "iloveyou"
test()
并没有打印出iloveyou 字符串,反而是返回了一个生成器对象
生成器是啥呢?
百度一下生成器的概念,简而言之就是,含有yield的函数的称为生成器,生成器也是一个迭代器,我是这么理解的,生成一个迭代器。
下面用一个例子来阐述为何要用到yield 的生成器。
假如此时我想要得到一个列表,那么我可以定义一个函数来生成一个自然数列表
def getList(num):
l = []
for i in range (0,num):
l.append(i)
return l
result = getList(1000)
此时,result 就是一个长度为1000的自然数列表了
那么当我要对这个列表中的数据做处理的时候,我还要再次用for 循环遍历这个列表
for i in result:
pass
如果说这个列表很长很长的话,存储起来就很消耗内存了,此时如果用 生成器 生成一个迭代器,运行时才生成值,保存在内存中永远都是一个常数,相比起存储一个列表,存储空间大大减小。
那么上述的函数可以改写为如下的函数
def getGenerator(num):
for i in range (0,num):
yield i result = getGenerator(1000)
next(result)
result 为生成器结果,用next来得到迭代器中的下一个元素,
也可用for循环来遍历输出每个元素
for i in result:
print(i)
用next来得到迭代器中的下一个元素,直到迭代器中的元素遍历完,会抛出一个StopIteration 停止迭代的错误。生成器中的元素只能访问一次。不像for循环,可以随时访问第几个元素。
而用for循环遍历却不会抛出该异常,是因为for循环自动捕捉到该异常,停止调用next()
总结了一下,想处理大量集合数据时,最好是使用迭代器来操作,不耗内存。
python 中的 yield 究竟为何物?生成器和迭代器的区别?的更多相关文章
- Python中的yield和Generators(生成器)
本文目的 解释yield关键字到底是什么,为什么它是有用的,以及如何来使用它. 协程与子例程 我们调用一个普通的Python函数时,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函 ...
- 关于Python中的yield
关于Python中的yield 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- 深入理解Python中的yield和send
send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互. 但是需要注意,在一个生成器对象没有执行next方法之前,由 ...
- python中,花括号,中括号,小括号的区别
python中,花括号,中括号,小括号的区别 Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示. 如: 字典:dic={'a':12,'b':34} 列表:list ...
- Python中的yield生成器的简单介绍
Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...
- python中的yield生成器详解
#原创,转载请先联系 在学习生成器之前,必须先了解一下迭代器.因为生成器就是一种特殊的迭代器,而且生成器用起来更加优雅. 迭代器的详解可以参考我的另一篇博文:https://www.cnblogs.c ...
- [转]关于Python中的yield
在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何 ...
- 【转载】关于Python中的yield
在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何 ...
随机推荐
- python安装setup.py问题
一:python下setuptools安装( No module named setuptools 解决方案) 1. 下载:在它的官网可以下载到安装包:https://pypi.python.org/ ...
- Unity3D 粒子系统 属性
- Redis4.0 之持久化存储
redis如果提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据会丢失 开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中. rdb和aof对性能都有影响,所以建议 ...
- mika的模板库
二分图最大匹配: 1.匈牙利算法:注意dfs中是dfs(c[w[i]]),搜索的是与之匹配的点. #include<cstdio> #include<cstring> ],w[ ...
- Linux CAN Shell 测试脚本程序
2012-01-13 22:57:14 为我的开发板2440做二次开发,添加了can驱动,做了驱动测试程序,没理由不添加一个测试脚本程序啊!修改了测试程序,使应用程序更加灵活,添加了一下传递参数.接着 ...
- 解决mysql连接报“Communications link failure”错误
<!--定义在从数据库获取新连接失败后重复尝试的次数.默认值: 30 :小于等于0表示无限次--> <property name="acquireRetryAttempts ...
- oracle 事务 与 提交
Oracle事务 一般事务(DML)即数据修改(增.删.改)的事务事务会将所有在事务中被修改的数据行加上锁(行级锁),来阻止其它人(会话)同时对这些数据的修改操作.当事务被提交或回滚后,这些数据才会被 ...
- Flutter 数据存储 加权限 sharedpreference, sqflite, file
要访问SD卡,首先读取权限肯定是要有的,不然写再多代码都是无用功.在AndroidManifest.xml文件中添加 <uses-permission android:name="an ...
- 【codeforces 438D】The Child and Sequence
[原题题面]传送门 [大致题意] 给定一个长度为n的非负整数序列a,你需要支持以下操作: 1:给定l,r,输出a[l]+a[l+1]+…+a[r]. 2:给定l,r,x,将a[l],a[l+1],…, ...
- Python内置进制转换函数(实现16进制和ASCII转换)
在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...