1.生成器
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator
生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。
生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是,不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器。
1.1python中的生成器
方式1:把一个列表生成式的[]中括号改为()小括号
要创建一个generator,有很多种方法,第一种方法很简单,只有把一个列表生成式的[]中括号改为()小括号,就创建一个generator
1.2 斐波拉契数列
方式2:函数中有了yield ,函数在调用时候不会执行,在next(函数对象)和函数对象.next() 才会执行,yield b 返回一个b的值。
原版,会异常,多调用next(函数对象)会异常。
def fbolaq():
a,b=0,1
for i in range(6):
yield b
a,b=b,a+b
a=fbolaq()
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
升级版 可以用循环控制。不会异常。
改进版
1.3 send的使用方式
send可以把新的值传给tmp ,当然也会生成一个新的数。记住如果是第一次使用必须用send(None)。具体如下: