print a
好吧,您打印最终值。
还有一些关于您的代码的评论:
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
您不需要在i
那里初始化,for 循环会为您完成。此外,您可以通过这样做来简化整个块:
numberlist = list(range(20))
鉴于您实际上并不需要将其作为列表,您根本不需要构建它,但您可以for n in range(20)
稍后运行。
然后你fib
在循环中一遍又一遍地重新定义你的函数。您应该在它之外定义它并重用它。
此外,当您知道要创建多个斐波那契数字的列表时,只需存储您计算的所有数字都会有所帮助。这样你就不必一遍又一遍地做同样的事情。您还可以使用生成器函数使这一切变得更容易:
def fibGenerator():
a, b = 0, 1
yield 0
while True:
a, b = b, a + b
yield a
fibonaccinumbers = []
fib = fibGenerator()
for n in range(20):
fibonaccinumbers.append(next(fib))
无需遍历范围并next
手动调用生成器,您还可以使用 itertools 中的take
-recipe来执行此操作,如下所示:
fibonaccinumbers = take(20, fibGenerator())
在发电机上
但是,仍然不太确定生成器的作用。
生成器是一个 Python 函数,它生成一系列返回值。这些值是延迟生成的,这意味着当您请求它时。您只需使用yield
而不是return
. Ayield
将“返回”一个值并暂停生成器。下次你请求一个值时,生成器将继续它停止的地方。
使用生成器可以创建无限序列。正如你在fibGenerator
上面的定义中看到的,有一个无限循环,它有一个yield
内部。当发电机停止时,尽管有这个循环,它也不会挂断。
这是一个不言自明的快速示例:
>>> def example():
print('begin')
i = 0
while True:
print('Calculating next value')
yield i
i += 1
>>> g = example()
>>> next(g)
begin
Calculating next value
0
>>> next(g)
Calculating next value
1
>>> next(g)
Calculating next value
2
>>> next(g)
Calculating next value
3
>>> next(g)
Calculating next value
4
该函数是从iterablenext
请求下一个值的内置函数。可迭代是您可以迭代的任何东西(例如);并且任何生成器也是可迭代的。for x in iterable: ...