如何使用生成器对象和yield方法在Python中找到一系列斐波那契数?

问题描述 投票:0回答:1

斐波那契数列是一系列数字,其数字是前两个值的总和。最初令 a = 0 且 b = 1。尝试使用 python 中的 generator 对象和 yield 方法获取代码。

是的,我已经尝试过,但我无法理解发生了什么,这是代码:

def fibo(limit):
    a, b = 0, 1
    while a < limit :
        yield a
        a, b = b, a + b
x = fibo(8)
print(x)

while True :
    try :
        print(next(x), end = '\n')
    except StopIteration:
        break
python python-3.x coding-style
1个回答
0
投票

代码按预期工作。假设您想知道如何它是如何工作的,那么首先需要了解两个关键点:

  • 生成器是一个可以在
    yield
    语句处“暂停”其执行的函数,该语句表示要返回的值(但与
    return
    不同,它不会结束函数的执行,只是暂停它)。您还可以创建单行生成器推导式;举个简单的例子,
    gen = (i*i for i in range(10))
  • 生成器在到达函数末尾时会引发一种称为
    StopIteration
    的特殊异常 - 在您的示例中,在
    while
    循环完成之后。这让您知道没有更多的值可返回。

将其应用到您的示例中:当您在第 6 行调用

fibo(8)
时,它不执行任何操作,仅创建生成器对象。该对象就是您在第 7 行打印出来时看到的内容 - 类似于
<generator object fibo at 0x10422c200>
。然后它什么也不做,直到您调用
next()
,此时它返回第一个值,然后暂停。每次调用
next()
时,它都会运行,直到遇到下一个
yield
语句,或函数结束(当它引发
StopIteration
时)。

作为旁注 - 虽然您的循环

next(x)
用于说明幕后发生的情况,但迭代结果的通常方法如下:

for num in fibo(8):
    print(num)

使用 for 循环对其进行迭代,让 Python 可以调用

next()
并为您处理
StopIteration

© www.soinside.com 2019 - 2024. All rights reserved.