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中的任何 ...
随机推荐
- html5 渐变按钮练习
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- zw字王《中华大字库》2018版升级项目正式启动
zw字王<中华大字库>2018版升级项目正式启动 https://www.cnblogs.com/ziwang/p/9500537.html 这次升级是和字库协会一起合作,首批推出的字体, ...
- 简单快速部署nexus3私服
本文适用范围:用户规模不大,不需要考虑maven仓库负载均衡的群体. 为何部署nexus3 之前由于懒某些原因,所有开发人员自己定义.m2的settings,大多使用ali提供的maven仓库,但是最 ...
- SQL并发处理方案——乐观锁和悲观锁
(一)乐观锁和悲观锁的概念 悲观锁 在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法.它可以阻 ...
- sai u 2016
再过20分钟,我就要结束2016年的工作回家过春节了.真是难过的一天啊,从来没有今天那么感受深刻,那么嫌弃时间太慢,没有归家心似箭,没有近乡情怯,只是好想,呵呵,来个午睡,来场电影,来点小说,哈哈哈. ...
- iOS日历控件
项目需要,前一阵子重构了下iPad工程,添加了一个滚动无缝日历. 当时没有头绪,网上找了一个源码改吧改吧就上线了(参考链接),这个功能很多而且流畅性也特别好,推荐不会写的可以参考下. 这几天,活不太忙 ...
- 关于Hibernate 连接mysql不能自动建表的问题
最近看旧书,李刚那本<轻量级J2EE>在讲解hibernate的时候遇到一个问题,就是与mysql连接后,明明配置了自动建表,却老是建不了表,上网查了发现是方言的原因,到底什么是方言?这里 ...
- 面向复杂应用,Node.js中的IoC容器 -- Rockerjs/core
Rockerjs Core 项目地址 项目主页 基于 TypeScript 和注解的轻量级IoC容器,提供了依赖注入.面向切面编程及异常处理等功能.Rockerjs Core可在任意工程中引入,是一个 ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- centos7 harbor 单机搭建
环境说明:centos 7.4 下面使用的域名是自己编造 可自行设置使用 域名在centos7.4 系统做解析 在windows vhost文件也做解析 分享压缩包 因github下载过慢 所以我 ...