生成器:生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成器【Generator】,生成器具有一边计算一边生生成的功能,起到节省空间的作用,真正能做到按需所取。来看下面这段代码:
[ x**2 for x in range(20) ]输出结果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]---------------------------------------------------------------------------------------A = [x**2 for x in range(20)]type(A)输出结果:<class ‘list‘>---------------------------------------------------------------------------------------B=( x**2 for x in range(20) )print(B)输出结果:<generator object <genexpr> at 0x0000015C857D7EB8>
我们可以看到A的输出结果是一个列表,我们试想一下,当列表中元素的数量很多时,会大大占用系统空间,加重cpu负载。而B的输出结果是生成器的内存空间,但是我们也想要得到A的输出结果,怎么办呢?我们可以使用__next__()来调用元素,每执行一次__next__(),向后调用一个元素。
B=( x**2 for x in range(20) )
print(B.__next__()) print(B.__next__()) print(B.__next__()) print(B.__next__())输出结果:0 # x=01 # x=1 4 # x=29 # x=3
每次调用一个元素,如果元素多了是不是很麻烦?所以__next__基本不会使用,而会使用for循环来迭代。generator非常强大,如果推算的算法比较复杂,用类似列表生成式的for
循环无法实现的时候,还可以用函数来实现。一般带有yield关键字的函数就被称为生成器。
来看这段代码
def func1(x): while x < 1000: n = x**2 yield n x+=1 f=func1(200) for i in f: print(i)
func1(x)函数就是一个生成器,当运行该func1(x),函数成了生成器,并通过yield来调用每一次的值。
总结:
一般带有yield的函数都是生成器,生成器使用方法__next__()取值,而且一次只能调取一个值,如要调取多个值,可以使用for来迭代取值。生成器可以作到按需取值,减少负载的作用。
-------不会开发的运维不是好厨师
时间: 2024-10-23 07:51:01