我在python 2.7中编写了这段代码来查找Fibonacci系列。但是我的代码中存在错误:
File "Fib.py", line 2, in <module>
class Fib:
File "Fib.py", line 21, in Fib
for n in Fib(4):
NameError: name 'Fib' is not defined
有人能解决这个错误吗?
class Fib:
def __init__(self,max):
self.max = max
def __iter__(self):
self.a=0
self.b = 1
return self
def __next__(self) :
fib = self.a
if fib > self.max :
raise StopIteration
a,b=b,self.a+self.b
return fib
for n in Fib(4):
print n
答案 0 :(得分:5)
免责声明:我无法从您发布的代码中重现您的错误(请参阅下面的猜测工作)。但是,我仍然会遇到错误,所以我会解决它们。
我明白了:
Traceback (most recent call last):
File "a.py", line 17, in <module>
for n in Fib(4):
TypeError: instance has no next() method
看起来,如果你的目标python 2.7,你已经与python 3混淆了。__next__
方法是在python 3中引入的(如果你感兴趣,可以在PEP 3114中)。在python 2中,使用next
。此外,由于self
必须用于访问实例成员变量,a,b=b,self.a+self.b
应为self.a, self.b = self.b, self.a + self.b
。这使你的代码:
class Fib:
def __init__(self, max):
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def next(self):
fib = self.a
if fib > self.max :
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
for n in Fib(4):
print n
产生输出:
0
1
1
2
3
请注意,将next
更改为__next__
并将print n
更改为print(n)
会使其在python 3中运行(但不是python 2.如果您需要两者都需要将next
转发至__next__
并使用括号print
)。
根据您的错误判断,您的原始代码可能如下:
class Fib:
def __init__(self,max):
self.max = max
def __iter__(self):
self.a=0
self.b = 1
return self
def __next__(self) :
fib = self.a
if fib > self.max :
raise StopIteration
a,b=b,self.a+self.b
return fib
for n in Fib(4): # Note that this makes the loop part of the class body
print n
缩进for
循环使其成为类主体的一部分,并且由于类名是一个尚不可访问的名称,因此它会引发NameError
。对于一个更简单的例子,尝试(它给出了类似的错误):
class A:
print A
因此,您遇到的错误很可能只是缩进混淆。但是,使用迭代器的好主意。
答案 1 :(得分:0)
实施斐波纳契系列的更简单方法:
known = {0:0, 1:1}
def fibonacci(n) :
if n in known:
return known[n]
res = fibonacci(n-1) + fibonacci(n-2)
known[n] = res
return res
答案 2 :(得分:0)
def fib(term_num):
if term_num == 0 or term_num ==1:
return term_num
return fib(term_num-2) + fib(term_num-1)
for x in range(1,11):
print(fib(x))
下面的输出:
1
1
2
3
五
8
13
21
34
55