python进阶免费-菜鸟世界 -python进阶---生成器
1、 什么是生成器
上一讲是迭代器,生成器本质上也是迭代器,生成器不会把结果保存在序列里,但是会保存生成器的状态,每次迭代时返回一个值,知道遇到StopIteration 时结束
2、获得一个生成器
获得生成器有两种方法
2.1 生成器函数
一个函数里出现了yeild关键字,这个函数就不再是普通函数了,而是一个生成器函数,yeild关键字的作用相当于return
#coding=utf-8
def myrange(max):
i = 0
while i < max:
yield i
i += 1
gen = myrange(5)
print type(gen)
2.2 生成器表达式
gen = (x for x in range(5))
print type(gen)
和列表推导式是不是很像呢
3、 生成器的使用
#coding=utf-8
def myrange(max):
i = 0
while i < max:
yield i
i += 1
# 生成器函数
gen = myrange(5)
for item in gen:
print item
# 生成器表达式
gen = (x for x in range(5))
for item in gen:
print item
越是看上面的代码越是觉得眼熟,有没有这种感觉呢看下面的代码
for item in range(5):
print item
不用我写的myrange,直接使用内置函数range可以实现相同的效果,内置函数range返回的是一个列表,实际上使用生成器的地方几乎都可以使用列表,那么问题来了,为什么还要搞出生成器这个东西呢?
很重要的一点是延迟计算
假设要循环1千万次,使用内置函数range 也是可行的,但是前面说到了,range函数返回的是一个列表
lst = range(10000000)
print type(lst)
print len(lst)
这可是实打实的有1千万个元素的列表啊,这得占用多少内存啊,虽然说现在内存不值钱了,但也不能毫无节制的使用,如果使用生成器就不存在这个问题了
gen = myrange(10000000)
此时,内存中并不存在1千万个元素,只是存在一个生成器,现在,还没有使用生成器,生成器就不会生成任何数值
gen = myrange(10000000)
for item in gen:
print item
在for 循环里,每循环一次,生成器生成一个数值,而不是像ragne函数那样一次性生成一个有1千万个元素的列表,这样做大大减少了对内存的使用
4、 生成器和迭代器的关系
其实不必太在意他俩的关系,因为他们存在的意义是不同的,生成器自动实现了迭代器协议,也就是说,生成器是有next方法的,不仅如此,还实现了__iter__方法,生成器既是迭代器,也是可迭代对象
#coding=utf-8
def myrange(max):
i = 0
while i < max:
yield i
i += 1
# 生成器函数
gen = myrange(5)
print gen.next()
i_gen = iter(gen)
print type(i_gen)
for i in i_gen:
print i
python进阶免费-菜鸟世界 -python进阶---生成器相关推荐
- python基础教程菜鸟教程-Python 基础教程
关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器 ...
- python class namedtuple 效率_菜鸟世界 -python进阶之 namedtuple
1.namedtuple tuple是不可变序列,当你不希望外界可以随意的改变你的函数返回值的时候,不妨将你的返回值以tuple的形式返回,tuple还可以做为字典的key,这些都是tuple的独到之 ...
- python经典类新式类_菜鸟世界 -python进阶---新式类与经典类
1.什么是新式类,什么是经典类 #coding=utf-8 class A: pass class B(object): pass A是经典类,B是新式类,这是Python2.x 里所特有的现象,之所 ...
- python菜鸟教程list_菜鸟世界 -python基础---list(上)
python有6个序列,最常用的是list ,tuple ,字符串.字符串我们前面已经提到过,但只是粗略的讲解,后面会专门开辟一篇教程来讲解,今天重点讲解list. 在讲解list之前,我们有必要回顾 ...
- rabbitmq python 消费者_菜鸟世界 -RabbitMQ---消费者示例
1.消费者的作用 消费者是勤勤恳恳的劳动者,它一直等待RabbitMQ给它分配任务,加入有100个任务,这些任务是由一个或是多个生产者生产出来的,现在,这些任务都放在RabbitMQ里. 消费者启动后 ...
- python基础代码事例-菜鸟世界 -python基础---set
今天介绍基础教程里最后一个数据结构set,也叫集合. 1.概念理解和基础用法 对于集合这个概念,你应该不会陌生,毕竟这玩意高中的数学课上就讲过,如果你都还给老师了,我可以帮你回忆一下.对于集合,我们只 ...
- python基础-菜鸟世界 -python基础---set
今天介绍基础教程里最后一个数据结构set,也叫集合. 1.概念理解和基础用法 对于集合这个概念,你应该不会陌生,毕竟这玩意高中的数学课上就讲过,如果你都还给老师了,我可以帮你回忆一下.对于集合,我们只 ...
- python msgpack_菜鸟世界 -python序列化第2篇---msgpack
1.It's like JSON,but fast and small msgpack用起来像json,但是却比json快,并且序列化以后的数据长度更小,言外之意,使用msgpack不仅序列化和反序列 ...
- python基础教程菜鸟教程-python基础菜鸟教程,Python的基础语法
原标题:python基础菜鸟教程,Python的基础语法 什么是Python?Python是一门简单直观的编程语言,并且目前是开源的,可以方便任何人使用. Python的开发哲学:用一种方法,最好是只 ...
最新文章
- RandomForest:随机森林预测生物标记biomarker——回归
- 有哪些专业学python_学习python有哪些好书和学习方法?
- Android图片轮播
- 使用Spring的NamedParameterJdbcTemplate完成DAO操作
- 如何查询oracle的共享内存,[20190104]ipcs查看共享内存段.txt
- 计算机软件需求规格说明规范_太阳能(光伏)组件安全规范测试简介_丙观科技
- java 压缩加密 github_关于Java:使用github中的AES-256-CBC加密
- 2019年7月数据库流行度排行:Oracle王者归来获大幅增长
- SqlServer Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)
- CSS效果:固定页脚、PNG透明、最小高度 3枚
- 自定义action消息
- java 网络序_JAVA 网络程序
- MBR、主引导扇区,主分区、扩展分区、逻辑分区,活动分区、引导分区、系统分区、启动分区的区别详解
- iOS 警告收录及科学快速的消除方法
- 20145205 《信息安全系统设计基础》第1周学习总结
- animate inater插件_maya插件管理器(Plug-in Manager),MAYA
- 内温的整体优先效应实验_认知
- 艾宾浩斯记忆曲线背单词
- 【数据结构】leetcode707:python实现链表设计;leetcode142:环形链表
- Typora恢复文件,找回忘记保存的记录
热门文章
- Linux 的启动流程
- 总结ThinkPHP使用技巧经验分享(四)
- [官网]Prevent a worm by updating Remote Desktop Services (CVE-2019-0708)
- UML作业第五次:分析系统,绘制状态图
- 谈谈Java运行机制
- 【css】如何实现响应式布局
- 利用jquery.form.js实现Ajax无刷新图片上传及预览功能
- jsonproperty注解_Jackson注解详解
- python系统-基于Python搭建Django后台管理系统
- python3-Python3.7.0官方版