说到生成器,我先讲一个迭代器的概念。迭代器就是可迭代对象,可迭代对象是实现了next方法并且在没有元素的时候抛出StopIteration异常的对象。跌代器主要用在for in语句里面,用于厉遍对象的子元素。例如,文件对象就是一个可迭代对象。我们可以这么操作:
With open("c:\aaa.txt") as f:
for line in f:
print(line)
用上面的代码就可以实现读取文件的每一行,之所以f能够运用在for in里面,就因为它是可迭代的。
接着说生成器,生成器是指可以产生可迭代数据的对象,包括生成器函数和生成器表达式。像下面的一个表达式就是生成器表达式:
genexp = ( line for line in f )
把上面的小括号换成中括号就成了列表表达式。
生成器表达式的优点是一次生成一个元素,占用内存小。列表表达式一次返回全部元素,占用内存比较多。
生成器函数主要是用yield语句实现的,举个列子:
def genfun():
yield 1
yield 2
上面的生成器函数可以通过下面的方式调用:
a = genfun()
a.__next__() //返回1
a.__next__() //返回2
a.__next__() //抛出stopiteration异常
也可以用如下的方式调用:
a = genfun()
#下面语句输出所以元素
for i in a:
print(i)