生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是,不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器。
创建生成器
- 使用类似列表生成器的方法
data——list1 = (x*x for i in range(10)) print(data_list1)
我们发现,它返回了一个
<generator object <...> at 0x...>
对象。我们试着遍历一下它for i in data_list: print(i)
它是可以正常输出的!我们可以用next()来获取它的下一个值。
- 在函数中使用
yield
def test1(): yield 10 a = test1() print(a)
它也返回了一个
<generator object <...> at 0x...>
对象!a是一个生成器对象我们使用
next(a)
就可以得到10了。
在生成器中yield
充当return
返回值的作用,它能保存生成器运行状态,并暂停执行,当next
时,从yield
位置继续执行。
可以使用生成器.send()
启动生成器并传递参数,参数会传给n = yield ...
中的n
。
生成器除非不能继续执行,不会自动结束,需要使用return
来StopIteration,返回的异常信息就是return
的内容。