我正在学习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并打印消息。
答案 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"。