共计 1210 个字符,预计需要花费 4 分钟才能阅读完成。
对于程序而言,内存也是很重要的,因为程序中很多数据都是保留在内存中的,如果内存中存储的数据过多,那么零碎就会解体,这是人们不心愿产生的。
能够采纳生成器推导式来解决内存不足的问题。例如,利用生成器推导式创立一个生成器 n,数据为 1~33 数字,能够写成 n = (i for i in range(1, 34))。这样当程序须要一个数时,程序才生成数据,能够节俭内存。然而生成器推导式太过简略,只能用一行代码的模式实现,如果要创立简单的生成器,如创立一个生成器 f,生成前 10 个斐波那契数字,生成器推导式曾经不能满足需要了,因为斐波那契数列最开始的两个数都无奈赋值。
函数能够实现简单的性能,然而要节俭内存,就须要应用生成器函数。生成器函数与一般函数的区别是函数中蕴含关键字 yield。实际上只有含有 yield 关键字的函数就是生成器函数。
生成器函数是用函数实现生成器。定义生成器函数的语法格局如下:
e786362d0c20491a0200471d493783a0.png
def 函数名 (参数):
函数体
yield 变量名
函数体
由语法格局可知,生成器函数与一般函数的区别在于页游函数体局部,生成器函数的函数体含有“yield 变量名”语句。yield 的性能相似于 return,return 是函数返回值,yield 的性能也是返回变量,然而它仅返回变量而不退出函数,因而,yield 能够看作是屡次返回变量且不会退出函数的 return。
在调用生成器函数时,写上函数名与参数,并通过一个变量接管返回值,语法格局如下:
变量名 = 函数名 (参数)
调用生成器函数的 yield 生成值的第一种办法如下:
next(变量名)
第二种办法如下:
变量名.__next__()
在把握了生成器函数的定义和调用之后,就能够应用生成器函数实现生成前 10 个斐波那契数字的案例了。这个案例次要分为三步,第一步是定义生成器函数,第二步是调用并赋值,第三步是打印后果,代码如下:
在上述程序中,首先定义生成器函数 fib(),函数内先定义斐波那契数列的两个初始值,再写一个 www.sangpi.comwhile True 死循环。这个死循环有些特地,先是用 yield 生成待应用的数字,再通过赋值语句“a, b = b, a+b”将 b 的值赋给 a,将 a + b 的值赋给 b,每次循环都是如此。
而后调用生成器函数 fib(),再调用生成器函数的 yield 生成值,最初打印后果。因为须要生成前 10 个斐波那契数字,因而能够采纳 for 循环,每循环一次生成并打印一个斐波那契数字,共循环 10 次。
第一次循环时,调用 yield 生成值 a,即 1; 第二次循环时,调用 yield 生成值 a,a 被赋值成 b 的值,即 1,而 b 被赋值成 a + b 的值,即 2; 第三次循环时,调用 yield 生成值 a,a 被赋值成 b 的值,而此时 b 的值是上次赋值的 a + b 的值,即 2……以此类推,就失去了整个斐波那契数列。