Python3 通过斐波那契数列讲解yield工作原理

我们现在通过一个列子来讲一讲yield的工作原理

示例1:斐波那契数列通过yield实现

def Fab(n):

    """
    使用yield来返回值;用非递归来实现斐波那契数列,使用yield来返回值,
    """
    a, b, m = 0, 1, 0
    i = 1
    while m < n:
        yield b
        a, b, m = b, a+b, m+1
        print("m值为: ", m, "\n")
        i += 1


t = Fab(10)
print("变量t的类型为: ", type(t), "\n")

num = 1
for i in t:
    print('Fab(%d)' % num, i)
    num += 1

输出结果:

变量t的类型为:  <class 'generator'> 

fab(1) 1
m值为:  1 

fab(2) 1
m值为:  2 

fab(3) 2
m值为:  3 

fab(4) 3
m值为:  4 

fab(5) 5
m值为:  5 

fab(6) 8
m值为:  6 

fab(7) 13
m值为:  7 

fab(8) 21
m值为:  8 

fab(9) 34
m值为:  9 

fab(10) 55
m值为:  10 

1、函数中有yield语句就代表该函数就是一个生成器

2、这个例子中Feb(n)函数就是我们自定义的一个生成器,而Feb中所有语句就是用来定义该生成器用于生成具有什么样特点的数据,这个例子旨在为了获取斐波那契数列数列的值。这个例子的斐波那契数列生成器,定义了只能生成1~n的斐波那契数列数列的值。

3、例子中的变量t就是一个生成器类型的数据 我们可以通过type(t)查看

4、当程序执行到语句t = Feb(10)时,此时开始进入函数Feb(n),当运行到yield语句的时候,此时就是暂停(就进入了阻塞状态)执行yield语句后面的其他语句,这里就有点类似于return,只不过return会结束整个函数的执行,而yield只是让函数进入阻塞状态),此时就返回到了语句t = Feb(10)(注意了:这里进行的返回,只是语句上的跳转,即:只是返回语句t = Feb(10)继续执行)与此同时生成去生成了第一个斐波那契数列数列,即:fab(1)=1。然后执行 print("变量t的类型为: ", type(t), "\n")。接着执行for循环,这个for循环的作用,就是依次取从n为:1~10的斐波那契数列的值。在for i in t 就是让我们依次从生成器中生成1~10的斐波那契数列,当for循环进行第一次循环时,打印出:fab(1) 1,然后进入第二次for循环,执行到for i in t时(这里需要使用工生成器生成第二个斐波那契数列),此时就会返回yield语句,就会从之前暂停出开始执行,即从语句a, b, m = b, a+b, m+1执行知道执行下一个while循环,遇到yield语句暂停执行,返回到for循环执行语句print('Fab(%d)' % num, i),接着执行第三次for循环,返回yield语句..., 以此类推。

以上就是本人自身的简介,不知能不能带来帮助 ^^

有一篇好的不错的讲解yield的文章可以参考:

https://blog.csdn.net/mieleizhi0522/article/details/82142856

猜你喜欢

转载自blog.csdn.net/qq_26948143/article/details/88090786