如何使用对象在python中创建Fibonacci系列

时间:2015-04-02 18:22:41

标签: python python-2.7 python-3.x fibonacci

我正在学习python中的对象。我正在尝试为斐波纳契系列编写python代码。

class palindrome:
    p=0
    q=1
    r=0
    def __init__(self,number):
        self.number=number

    def calc(self):
        p=0
        q=1
        r=0
        if (self.number == 1):
            print "0 1"
        for i in range(3,1):
            r = p + q
            p = q
            q = r
            print " %d " %r

pal = palindrome("1")
print pal.number()

当我使用不同的值运行此程序时,它会显示错误。如果我传递一个对象1然后它不会打印001,如果我传入一些如何我第一次打印的东西,再也不打印它。例如,斐波那契系列中的0 1。

因此,当我尝试将此语句放入for循环'for I(3,self.number)'时,它会抛出一个错误,指出你无法在int中定义一个字符串。那么如何在for循环中传入object的值。另外我如何比较self.number == 1并打印消息。

1 个答案:

答案 0 :(得分:1)

我认为您可能来自C或Java背景,其中"原语"之间的语言存在固有的差异。诸如int和" Object"等类型类型如String。 此外,这些编译的语言具有"静态类型"其中变量是用类型声明的。

在python中,它完全不同。 Everything 是一个对象。类型不知道静态。

考虑到这一点,让我们跟踪代码的执行情况:

pal = palindrome("1") # Creates a ojbect of type string with the value "1"
                      # Creates a palindrome object named pal.
                      # Calls palindrome's __init__ to construct pal

下降到palindrome ...

class palindrome:
    p = 0
    q = 1
    r = 0
    # These are like Java's static varialbes, NOT member variables
    def __init__(self,number): # number is the STRING OBJECT "1"
        self.number = number # Copies the string "1" to self.number, a member variable

对于构造函数来说,它是回到main ...

print pal.number() # pal.number is a string, but you are calling it as if it
                   # is a function. This would work if string objects were 'callable'

但所谓的内置"类型str未定义调用机制。运行您显示的确切代码会导致此错误:

TypeError: 'str' object is not callable

现在,回答您的具体问题

if (self.number == 1):
    print "0 1"

此检查必须失败,因为self.number的值为"1" - 一个字符串对象,但您将它与1 - 一个int对象进行比较。因此" 0 1"没有打印

for i in range(3,1):
    ...

由于3大于1,因此计算为空范围且循环不运行

for i in range(3, self.number):

range()需要两个int - s,但self.number是一个字符串。因此,您应该看到此错误:TypeError: range() integer end argument expected, got str。要将str转换为int

for i in range(3, int(self.number)):

self.number的值被动态地转换为int。如果self.number不是要转换为int的适当字符串,则会失败,例如" abc"而不是" 1"。