生成器的引入讲解

原创 2018年04月16日 10:30:18
比较一下列表生成式和生成器:
对于列表生成式而言:它在执行完毕以后,直接将所有数据全部加载到内存中。列表生成器可以遍历多次里面的所有元素!
                    优点:由于所有数据已经存在内存,检索效率变高
                    缺点:如果一些数据不经被常使用,会存在内存的浪费
对于生成器而言:它执行完毕以后,仅仅返回的是一个generator对象,内存中并不存在generator中的元素值,生成器里的元素当操作者要要一个元素就next一次,生成器里的元素只能遍历一次,当元素第一次全部取完就无法再从生成器中获取
                     优点:内存得到很好的利用,不会浪费
                     缺点:相对的效率变低了
创建生成器对象(两种生成器的创建)
方式一:生成器表达式
genn = (x * 2 for x in range(1, 11))
# print(type(genn))      # 查看genn的类型!<class 'generator'> 内存里记入的是一个generator对象 元素没有加载在内存!
# 遍历循环打印genn中的所有元素
for i in genn:
    print(i)
print()# 空一行
for i in genn:  # 想再打印一次genn中的所有元素
    print(i)    #结果此行代码不被执行,因为生成器中的所有元素只能被遍历一次。
print(next(genn))  # 报错! 因为生成器中的元素已经被全部遍历打印出来,不能再循环遍历,print(next(genn))因为强行打印下一个元素,所以报错! 说明: 生成器对象是不可逆的!获取生成器里面的元素仅仅只能获取一次(好好理解这句话)
list = list(genn)  # 想要括号里面的类型变成列表,用list去接受一下
print(list) # 打印list  将生成器里的元素以列表的形式打印出来:[2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 所有的内容加载在内存了

# 遍历list
 for i in list:
     print(i)

# print('*' * 50)  # 在输出台区别上一行打印  用 50个*  隔开
#
# for i in list:  # 打印完*号,再遍历一次
#     print(i)
# 对于list而言 想遍历多少次遍历多少次 里面的元素可以无限循环获取,这个也是list和generetor内部的一些不同点
# 方式二: 生成器函数
# 使用函数来创建生成式
def func(n):  # 有形参的
    for i in range(n):
        yield i         # 这个函数就结束了,其实它也不算有返回值的函数
# 当执行func函数时,for会被启动,假如n=5,for循环0-4,走完for语句,然后就有yield,当你要一个值的时候,yiled给你一个值,
# 然后挂起,(计入函数的形式状态),等你再去执行这个函数的时候,它就从下一个点,再yield一个给你。
f = func(5) # func 传一个5,可以得到一个f对象,f对象就是方法对象
print(f)  # 打印f,运行结果为:<generator object func at 0x0000027E52574A98> # 是一个generator对象  得到的是func一个generator的完整的对象,并不是里面有数据的, 那你要它里面的数据能够拿到,就要给它执行起来!
print(next(f)) # 执行f ,next(next:下一个) 是在生成器中一次取一个,
# next 一下 ,就是我对这个generator对象往下走一次,走完yield i 就标注一下,然后我在next一下,yield就在标注的地方再往下走
print(next(f))
print(next(f))
print(next(f))
print(next(f))
# print(next(f))  # 这个next已经超出了range的范围,报一个异常,

生成器详解

可迭代对象(iterable) 与 迭代器(iterator)关系如下图:对一个iterable用for … in …进行迭代时,实际是先通过调用iter()方法得到一个iterator,假设叫做X。...
  • xsj_blog
  • xsj_blog
  • 2017-04-23 19:17:18
  • 416

列表解析及生成器表达式的效率问题

列表解析(List Comprehensions),来自函数式的编程语言Haskell。是一个非常有用,简单而且灵活的工具,可以动态地创建列表。自Python2.0,列表开始加入到Python中,里面...
  • Jerry_1126
  • Jerry_1126
  • 2016-04-18 05:48:53
  • 864

js模拟微信聊天页面

不说啥了,贴代码 .fl,.fr{ margin-bottom: 5px; } .fl img{ float: left; } .fl p{ float: left; font-siz...
  • srj15110129498
  • srj15110129498
  • 2017-08-08 13:25:49
  • 159

深入理解python的生成器表达式和列表解析

前言       没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出。虽然之前有接触过python协程的概念,但是只是走马观花,这两天的一次交谈中,别人问到了协程,顿时语...
  • fly910905
  • fly910905
  • 2017-07-29 08:07:12
  • 610

【JAVA】纯JSP文件二维码生成代码分享

int BLACK = 0xFF000000;       int WHITE = 0xFFFFFFFF;   String text = "http://www.haiqiancun....
  • zyx13859002783
  • zyx13859002783
  • 2014-05-31 16:07:38
  • 10554

javascript livequery 实例

test.html Document
  • yjyqwe
  • yjyqwe
  • 2017-10-31 17:42:32
  • 179

哈希表讲解

哈希表也称散列表,是一种数据结构,在JAVA集合中的HASHMAP,HASHTABLE都运用了哈希表.它可以提供快速的插入操作和查找操作,不论有多少数据项,插入与删除只需要接近常量的时间:O(1)时间...
  • JavaMan_KA
  • JavaMan_KA
  • 2011-04-25 18:04:00
  • 426

操作系统引导探究(简单讲解开机后如何引入操作系统)

  • 2010年02月10日 17:23
  • 226KB
  • 下载

使用Python写一个贪吃蛇AI

不久前在网上看到一张贪吃蛇的动态图片,蛇最后把所有的食物吃完并占满整个运动空间。  觉得挺好玩的,于是用Python写了一个。 Blog: http://hawstein.com/posts...
  • yidangui
  • yidangui
  • 2013-04-18 12:50:35
  • 846
收藏助手
不良信息举报
您举报文章:生成器的引入讲解
举报原因:
原因补充:

(最多只允许输入30个字)