玩蛇网提供最新Python编程技术信息以及Python资源下载!

Python yield与斐波那契数列问题

def fib():
    a,b=0,1
    while True:
        yield b
        a=b
        b=a+b
i=10
while i>0:
    print fib().next()
    i-=1

输出的全是1,而

def fib():
    a,b=0,1
    while True:
        yield b
        a=b
        b=a+b
f=fib()
i=10
while i>0:
    print f.next()
    i-=1

输出的就是斐波那契数列呢?

用yield这种函数叫做生成器(generater)如果你每次都调用fib()他会每次都实例化一个新的生成器,但是如果你先把f赋值成这个生成器的话 他就会正常的每次从yield的位置执行,不断生成新的数

每次调用 fib()实际都生成了一个新的实例 可以看到其地址是不一样的 所以不是同一个对象
而用 f=fib()以后, f 是一个实例,它可以正常迭代

>>> def fib():
...     a,b = 0,1
...     while True:
...             yield b
...             a = b
...             b = a + b
...
>>> f = fib()
>>> fib()
<generator object fib at 0x1036e8af0>
>>> fib()
<generator object fib at 0x1036e8aa0>
>>> f
<generator object fib at 0x1036e8a50>
>>> f
<generator object fib at 0x1036e8a50>

如果你吧 fib() 放到 while 里,那么每次调用的都是从新执行的函数 fib,并不会 share或者可能抹掉之前 yield 的状态,那么他的 next 永远是第一个。

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19680.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月24日 - 14时29分45秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules