---生成器
我们在函数中使用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
标签:调用,函数,生成器,yield,next,fib From: https://www.cnblogs.com/powfu/p/16887114.html