python---基本知识19之生成器
概念?
是一个特殊的迭代器,拥有迭代器的特性;主要是为了节省内存空间,就是用到了才去生成,才去取值,而不是一下子把所有的都取出来;
创建方式:
1.通过推导式:其实就是把列表推导式的[]换成()
l=(x for x in range(10000000))
print(l.__next__())
2.通过生成器函数,生成器函数主要有两个特点,第一是函数中包含yield语句,第二是函数的执行结果就是一个生成器:
def generator():
print(5)
yield 6
print(4)
yield 1
gen=generator()
print(next(gen))
print(next(gen))
访问生成器数据:可以通过next()函数,或者生成器对象的方法:__next__(),以及for in;我们应该注意到的是函数的执行结果是一个生成器,但是其实我们在调用函数执行的时候,函数并没有执行,只有当访问生成器数据的时候才会执行,并且遇到yield语句的时候就会被暂停;
next(gen)
gen.__next__()
for i in gen:
print(i)
send()方法:其实和next()的功能差不多,只不过多了一个功能,就是可以给上一次yield语句指定返回结果,这里需要注意一点是上一次,那么如果是第一次执行的话,由于没有上一次,所以指定的结果只能为none;
def generator():
print(5)
res= yield 6
print(res)
yield 1
gen=generator()
print(gen.send(None))
print(gen.send('a'))
注意事项:首先生成器如果碰到return语句,会报StopIteration异常,因为return就是返回,后面就不会执行了,肯定会抛出异常,第二点是生成器和迭代器一样,只会执行一遍,执行完毕就会被释放;