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中的任何 ...
随机推荐
- WCF基础二
1:地址 . WCf 的每一个服务都有一个唯一地址,地址包括传输协议和服务位置. HTTP:采用http\https协议进行传输,默认端口为80. TCP:采用ne.tcp协议进行传输,默认端口为80 ...
- Running ROS on Windows 10
1.在Windows10下安装ROS.需要开启WSL.参考 2.修改ubuntu国内源,可以提高安装包下载更新速度. (1)原文件备份:sudo cp /etc/apt/sources.list /e ...
- Python 官方文档&教程
英文原版(3.6版): https://docs.python.org/3.6/index.html https://docs.python.org/3.6/tutorial/index.html 汉 ...
- python3下爬取网页上的图片的爬虫程序
import urllib.request import re #py抓取页面图片并保存到本地 #获取页面信息 def getHtml(url): html = urllib.request.urlo ...
- 使用OGG添加唯一标识字段到目标表
利用GoldenGate,可以获取到变更记录在源端对应的redo日志序号,redo中的地址RBA,如果源端是RAC,还可以拿到源端节点的编号,通过这3个值,可以定位该变更记录的唯一性. 这些信息,在G ...
- Unity 新手入门 如何理解协程 IEnumerator yield
Unity 新手入门 如何理解协程 IEnumerator 本文包含两个部分,前半部分是通俗解释一下Unity中的协程,后半部分讲讲C#的IEnumerator迭代器 协程是什么,能干什么? 为了能通 ...
- shell实现大批量word转码然后分析相关字段
需求 需要从服务器中的所有附件(2013-2019) 共60G查找相关字段 在linux上面直接打开doc等是乱码的 思路 先全部附件转码为txt, 然后用grep遍历查找字段实现 转码shell # ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
- hello2代码的简单分析
hello2部分代码: String username = request.getParameter("username");//将get~这个方法赋给username这个对象 i ...
- 【搭建】MongoDB在Linux环境的搭建
环境:Linux CentOS6.5,mongo 4.1.6 一.下载安装 1.创建mongo的安装文件夹,以及安装包上传路径 mkdir /opt/module mkdir /opt/softwar ...