斐波那契数列是一系列数字,其数字是前两个值的总和。最初令 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
代码按预期工作。假设您想知道如何它是如何工作的,那么首先需要了解两个关键点:
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
。