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进阶---生成器相关推荐

  1. python基础教程菜鸟教程-Python 基础教程

    关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器 ...

  2. python class namedtuple 效率_菜鸟世界 -python进阶之 namedtuple

    1.namedtuple tuple是不可变序列,当你不希望外界可以随意的改变你的函数返回值的时候,不妨将你的返回值以tuple的形式返回,tuple还可以做为字典的key,这些都是tuple的独到之 ...

  3. python经典类新式类_菜鸟世界 -python进阶---新式类与经典类

    1.什么是新式类,什么是经典类 #coding=utf-8 class A: pass class B(object): pass A是经典类,B是新式类,这是Python2.x 里所特有的现象,之所 ...

  4. python菜鸟教程list_菜鸟世界 -python基础---list(上)

    python有6个序列,最常用的是list ,tuple ,字符串.字符串我们前面已经提到过,但只是粗略的讲解,后面会专门开辟一篇教程来讲解,今天重点讲解list. 在讲解list之前,我们有必要回顾 ...

  5. rabbitmq python 消费者_菜鸟世界 -RabbitMQ---消费者示例

    1.消费者的作用 消费者是勤勤恳恳的劳动者,它一直等待RabbitMQ给它分配任务,加入有100个任务,这些任务是由一个或是多个生产者生产出来的,现在,这些任务都放在RabbitMQ里. 消费者启动后 ...

  6. python基础代码事例-菜鸟世界 -python基础---set

    今天介绍基础教程里最后一个数据结构set,也叫集合. 1.概念理解和基础用法 对于集合这个概念,你应该不会陌生,毕竟这玩意高中的数学课上就讲过,如果你都还给老师了,我可以帮你回忆一下.对于集合,我们只 ...

  7. python基础-菜鸟世界 -python基础---set

    今天介绍基础教程里最后一个数据结构set,也叫集合. 1.概念理解和基础用法 对于集合这个概念,你应该不会陌生,毕竟这玩意高中的数学课上就讲过,如果你都还给老师了,我可以帮你回忆一下.对于集合,我们只 ...

  8. python msgpack_菜鸟世界 -python序列化第2篇---msgpack

    1.It's like JSON,but fast and small msgpack用起来像json,但是却比json快,并且序列化以后的数据长度更小,言外之意,使用msgpack不仅序列化和反序列 ...

  9. python基础教程菜鸟教程-python基础菜鸟教程,Python的基础语法

    原标题:python基础菜鸟教程,Python的基础语法 什么是Python?Python是一门简单直观的编程语言,并且目前是开源的,可以方便任何人使用. Python的开发哲学:用一种方法,最好是只 ...

最新文章

  1. RandomForest:随机森林预测生物标记biomarker——回归
  2. 有哪些专业学python_学习python有哪些好书和学习方法?
  3. Android图片轮播
  4. 使用Spring的NamedParameterJdbcTemplate完成DAO操作
  5. 如何查询oracle的共享内存,[20190104]ipcs查看共享内存段.txt
  6. 计算机软件需求规格说明规范_太阳能(光伏)组件安全规范测试简介_丙观科技
  7. java 压缩加密 github_关于Java:使用github中的AES-256-CBC加密
  8. 2019年7月数据库流行度排行:Oracle王者归来获大幅增长
  9. SqlServer Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)
  10. CSS效果:固定页脚、PNG透明、最小高度 3枚
  11. 自定义action消息
  12. java 网络序_JAVA 网络程序
  13. MBR、主引导扇区,主分区、扩展分区、逻辑分区,活动分区、引导分区、系统分区、启动分区的区别详解
  14. iOS 警告收录及科学快速的消除方法
  15. 20145205 《信息安全系统设计基础》第1周学习总结
  16. animate inater插件_maya插件管理器(Plug-in Manager),MAYA
  17. 内温的整体优先效应实验_认知
  18. 艾宾浩斯记忆曲线背单词
  19. 【数据结构】leetcode707:python实现链表设计;leetcode142:环形链表
  20. Typora恢复文件,找回忘记保存的记录

热门文章

  1. Linux 的启动流程
  2. 总结ThinkPHP使用技巧经验分享(四)
  3. [官网]Prevent a worm by updating Remote Desktop Services (CVE-2019-0708)
  4. UML作业第五次:分析系统,绘制状态图
  5. 谈谈Java运行机制
  6. 【css】如何实现响应式布局
  7. 利用jquery.form.js实现Ajax无刷新图片上传及预览功能
  8. jsonproperty注解_Jackson注解详解
  9. python系统-基于Python搭建Django后台管理系统
  10. python3-Python3.7.0官方版