1.什么是生成器?

生成器是由一个函数和yield关键字创建出来的生成器最大的作用就是帮助我们节省内存空间

比如,当我们需要使用一个1-100000的列表,遍历每一个数进行操作,我们首先会想到的就是创建一个列表,然后遍历该列表,如下

var = [i for i in range(100001)]
print(var)

for i in var:
print(i)

我们通过推导式创建了一个列表,存储着我们需要的所有数据,虽然在功能上没有问题,但是巨大的列表消耗了我们大量的内存,那么我们该如何解决呢?

生成器就可以很好的解决该问题,他的原理就是每次调用生成器,都只会生成一个对象供我们操作。这样也可以实现功能,同时节省内存

2.如何创建一个生成器?

当执行生成器函数的时候,知识生成了一个生成器,并没有执行函数代码

当next调用的时候,会执行到yiled,将yield的右侧值返回,并保存此时函数的执行位置,当再次调用next的时候,再执行到yield,返回yiled右侧的数值,再次记录执行的位置,直到函数结束,就会抛出一个StopIteration的异常

# 创建一个生成器函数
def gen(total):
    for i in range(total):
        yield i

# 创建 一个生成器
ge = gen(100000)

# 执行一次yield
print(next(ge))  # 1
print(next(ge))  # 2
print(next(ge))  # 3
print(next(ge))  # 4

对于生成器,我们可以使用for进行迭代

def gen(total):
    for i in range(total):
        yield i


ge = gen(10)

for i in ge:
    print(i, end=' ')  # 0 1 2 3 4 5 6 7 8 9 

 

3.生成器进阶

有时候我们希望给生成器传递一些参数来控制程序的运行,就可以使用send函数

send函数和next函数都可以使得生成器执行下一步返回一个对象,所不同的是send可以传递参数

def gen(total):
    for i in range(total):
        v = yield i
        print(v)


# 生成一个生成器对象
ge = gen(10)

# 执行到yield,返回数字0,阻塞住,此时v还没有完成赋值
res = next(ge)
print(res)  # 1
# 函数继续执行,完成v的赋值 v = 10,执行print,再次执行到yield,返回1,然后阻塞住
print(ge.send(10))

注意:当生成器第一次调用的时候,最好使用next方法,如果一定要用send,则传递的参数为None,即send(None)

 

posted on 2022-11-02 21:02  阿明明  阅读(60)  评论(0)    收藏  举报