生成器

---生成器

我们在函数中使用yield,这个函数就是生成器函数。

生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。

 

以下面的案例举例:当主函数f = fib(10)执行时,fib函数不会被立即调用,而是生成一个生成器对象,除非使用next(f)或者f.__next__()方法去调用生成器,

每调用一次,就会执行生成器函数,当执行到yied b时,函数fib会被暂停,将b值作为函数的返回值返回。知道遇到下一次next(f)或者f.__next__(),生成器函数接着yield b的抵挡继续往下执行。

 

以下斐波那契数列案例

def fib(n):
    a=0
    b=1
    count = 0
    while count < n:
        tmp = a
        a = b
        b = tmp + b
        yield b     #函数到此处会暂停,然后跳转到next(f),等next(f)结束后,在回到这里继续执行后面的语句。注意yield b其实就是相当于return b
        count += 1
f = fib(10)      
for i in f:      #对生成器对象循环遍历
    print(i)

 

 

 

 

生成器传值

我们可以通过 生成器对象.send()方法给生成器传值,其实就是给yield传值,不过在生成器函数里,需要有一个值来接收,以下案例时n=yield,来接收参数

def g_test():
    while True:
        n = yield
        print("receive from outside",n)
g = g_test()
g.__next__()    #调用生成器,同时发送none给yield

for i in range(10):
    g.send(i)   #调用生成器,同时发送i给yield

 

posted @ 2022-11-13 21:54  powfu  阅读(62)  评论(0)    收藏  举报