我试着编写一个简单的python函数,它应该返回一些指定最大值的fib数列表。但是我收到了这个错误。我似乎无法找出我做错了什么。
def fib(a,b,n):
f = a+b
if (f > n):
return []
return [f].extend(fib(b,f,n))
>>>fib(0,1,10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lvl2.py", line 35, in fib
return [f].extend(fib(b,f,n))
File "lvl2.py", line 35, in fib
return [f].extend(fib(b,f,n))
File "lvl2.py", line 35, in fib
return [f].extend(fib(b,f,n))
File "lvl2.py", line 35, in fib
return [f].extend(fib(b,f,n))
TypeError: 'NoneType' object is not iterable
答案 0 :(得分:9)
list.extend
扩展了就地列表。您可以使用+
运算符将两个列表连接在一起。
但是,您的代码不是特别Pythonic。您应该将生成器用于无限序列,或者作为对代码的略微改进:
def fib(a,b,n):
data = []
f = a+b
if (f > n):
return data
data.append(f)
data.extend(fib(b,f,n))
return data
使用生成器进行无限序列的示例:
def fibgen(a, b):
while True:
a, b = b, a + b
yield b
您可以使用fibgen()
创建生成器,然后使用.next()
拉出下一个值。
答案 1 :(得分:1)
您可能对特别简洁的Fibonacci实现感兴趣,但它仅适用于Python 3.2及更高版本:
@functools.lru_cache(maxsize=None)
def fib(n):
return fib(n-1) + fib(n-2) if n > 0 else 0
第一行的要点是记忆递归调用。换句话说,评估例如fib(20)
,因为你会重复很多努力,所以我们会在计算值时缓存这些值。
执行
仍然可能更有效率import itertools
def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(islice(iterable, n, None), default)
nth(fibgen())
如上所述,因为它没有大缓存的空间开销。