生成器
列表表达式回顾
- # -*-coding:utf-8 -*-
- __date__ = 2018/3/5
- __author__ = xiaojiaxin
__file_name__ = 生成器
#a1=[x*2 for x in range(10000000000)] #全部加载至内存, 列表表达式
生成器创建的两种方法
- a=(x*2 for x in range(5))
- print(a)
- # <generator object <genexpr> at 0x000000E29B512990>
- # 里面没有值!!!! 生成器只是一个对象
生成器执行的两种方法
- # 就比如说列表和元组等都是菜, 想吃就直接吃, 生成器只是一个厨师, 他会做菜, 但是你要吃哪道菜, 他才会去加载那一道菜
- # 第一种方法: 使用内置方法
- print(a.__next__())
- #0
- print(a.__next__())
- #2
- print(a.__next__())
- #4
- # 第二种方法: 使用 next() 方法
- print(next(a)) #等价于 Python2.x a.next()
- #6
- print(next(a))
- #8
- # print(next(a)) #报警: 停止迭代
- # #StopIteration
- # print(next(a))
- # 生成器就是一个可迭代对象 (iteration 迭代)
- #for 内部对 b 做了 next() 调用, 之前的数据作为垃圾回收了
- #for 循环检测是否还有数据, 及时结束 next() 调用
- b=(x for x in range(10))
- for i in b: #for 内部对 b 做了 next() 调用, 之前的数据作为垃圾回收了
- print(i) #for 循环检测是否还有数据, 及时结束 next() 调用
- # 生成器一共两种创建方式
- # 第一种:(x for x in range(5))
- # 第二种: yield
生成器函数与普通函数的区别
- def foo():
- print("haha")
- return 1
- foo()
- #haha
- print(foo()) #执行函数, 并返回返回值
- #haha
- #1
- print(foo)
- # <function foo at 0x000000A30D962E18>
- def fou():
- print("123")
- yield 2 #只要有 yield 就是生成器对象
- print("456")
- yield 4
- fou()
- # #空表示没有执行 fou() 函数
- print(fou()) #不执行函数, 不返回函数返回值
- # <generator object fou at 0x00000092754D2A40>
- print(fou)
- # <function fou at 0x000000A823DBD158>
- #fou() 是一个生成器对象
- # 有一个 yield 就只有一道菜, 有多个 yield 就有多道菜
- next(fou()) #执行 fou() 生成器对象
- #123
- next(fou())
来源: http://www.bubuko.com/infodetail-2544119.html