是一个类
类中同时包含有__iter__()
方法和__next__()
方法的都是生成器。
获得方法
常见的有几种
eg.1 生成器generator
lst = [1,2,3,4]
generator = (x for x in lst)
注意这里括号不是’[]’,否则生成将是一个数组。
相比于用’[]’生成的数组,这里仅生成了generator,而数据则在需要的时候才生成,这在数据量较大时有明显的内存消耗优势。
eg.2 生成器方法generator function
lst = [1,2,3,4]
def GetGenerator():
for t in lst:
yield t
generator = GetGenerator()
凡是包含yield的方法都是generator function,这个方法调用后的返回值是一个generator。
使用方法
生成器的理念在于按需获取,从而避免将数据一次性生成。可以通过next(generator)
或者generator.__next__()
来获取生成的数据,需要注意的是获取数据时如果超过了生成器拥有的数据量,将会抛出一个StopIteration的异常。
三个基本应用实例
# 生成器
class Example(object):
def __init__(self):
self.m_lst = [
(1, '张三'),
(2, '李四'),
(3, '王五'),
(4, '赵六'),
]
def Apply_GetTupleGenerator(self):
for t in self.m_lst:
yield t
def Apply_Traversing(self):
generator = (t for t in self.m_lst)
for t in generator:
print(t)
def Apply_Enum(self, nBegin = 0):
def _enum():
nIdx = nBegin
while(True):
yield nIdx
nIdx += 1
return _enum().__next__
if __name__ == "__main__":
example = Example()
# 应用一:生成器的基本使用
generator = example.Apply_GetTupleGenerator()
print(next(generator)) # (1, '张三')
print(next(generator)) # (2, '李四')
print(next(generator)) # (3, '王五')
print(next(generator)) # (4, '赵六')
# 应用二:遍历
example.Apply_Traversing() # 输出同上面四句
# 应用三:枚举
enum = example.Apply_Enum()
print(enum()) # 0
print(enum()) # 1
print(enum()) # 2
print(enum()) # 3