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
就可以创建生成器了。一个 yield
语句将“返回”一个值并且暂停生成器。下一次你请求一个值时,生成器会从上次离开的地方继续执行。
使用生成器可以让你创建无限序列。正如上面的 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
< p >
next
函数是内置函数,用于从
可迭代对象 中请求下一个值。可迭代对象是指任何可以被迭代的对象(例如,
for x in iterable: ...
),而任何生成器也都是可迭代对象。
a, b = b, a + b
是完全可以的。 - jfs