Python: 斐波那契数列
我只是想通过写一些基本的函数来提高我的编程技能。
我想用斐波那契数填充一个列表,但我觉得我的代码给出的结果是把所有数字加在一起的总和,而不是我想要的斐波那契数值。
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
print numberlist
fibonaccinumbers = []
for n in numberlist:
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
a = fib(n)
fibonaccinumbers.append(a)
print a
我哪里出错了呢?
11 个回答
问题出在最后一行。我敢肯定这是个干扰:你应该打印的是列表,而不是a
。
还有一些其他的小建议:
1: 这一整段代码其实只是重新创建了range
返回的列表:
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
把i = 0
赋值也没什么必要。你可以试试:
numberlist = range(20)
在Python 3中,调用list(range(20))
,因为range
并不会生成一个完整的列表。
2: 在每次循环中重新定义fib
函数虽然不会出问题,但其实没必要。把定义移到外面去就行了 :)
抱歉,我真是个傻瓜。我打印的是'a',也就是斐波那契数列最后一次计算的结果。
我应该打印我的列表才对。
真是的...
print a
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
numberlist = list(range(20))
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))
fibonaccinumbers = take(20, fibGenerator())
>>> 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
好吧,你需要打印出最后的值。
还有一些关于你代码的建议:
你其实不需要在那儿初始化 i
,因为 for 循环会自动帮你处理这个。此外,你可以通过这样做来简化整个代码块:
而且,既然你并不需要把它做成一个列表,其实根本不需要构建那个列表,你可以直接在后面运行 for n in range(20)
。
另外,你在循环里面一次又一次地重新定义你的 fib
函数。你应该把它定义在循环外面,然后重复使用它。
还有,当你知道想要创建多个斐波那契数的时候,把你计算的所有数字存起来会很有帮助。这样你就不需要重复做同样的事情。你也可以使用生成器函数来让这一切变得更简单:
与其在一个范围内循环并手动调用 next
来获取生成器的下一个值,你可以直接使用 take
-食谱,这样做就像这样:
关于生成器
不过我还是不太明白生成器到底是干嘛的。
生成器是一个 Python 函数,它可以生成一系列返回值。这些值是懒惰生成的,也就是说,只有在你请求的时候才会生成。你只需使用 yield
代替 return
来创建一个生成器。一个 yield
会“返回”一个值并暂停生成器。下次你请求一个值时,生成器会从它暂停的地方继续。
使用生成器可以让你创建一个无尽的序列。正如你在上面 fibGenerator
的定义中看到的,有一个无尽的 while 循环,里面有一个 yield
。生成器停止时,尽管有这个循环,它也不会卡住。
这里有一个简单的自我解释的例子:
next
函数是一个内置函数,用于请求 可迭代对象 的下一个值。可迭代对象是指任何你可以进行迭代的东西(例如 for x in iterable: ...
);而任何生成器也是可迭代的。