python进阶(五)--生成器

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)。具体如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41781408/article/details/88105159
今日推荐