不断收到错误 'function @ 0xb6ff9924 (or something similar)'

keep getting an error 'function @ 0xb6ff9924 (or something similar)'

我正在尝试创建一个小程序来计算形状的面积。每当我输入形状的名称时,它都会打印出 "function at 0xetc"。我很难弄清楚问题出在哪里。我知道我的 area 函数可能搞砸了,但我无法去那里调试它。我最初以为我定义了与形状同名的函数,它是从输入中调用它们,但我更改了名称并得到了相同的消息。这是代码:

#geometry program

#shapes

def squar(x, y):
    result = x * y
    return result

def rectangl(x, y):
    result = x * y
    return result

def circl(r):
    result = 3.14 * (r^2)
    return result

def triangl(h, b):
    result = (h^b * b)/2
    return result

s = raw_input("Shapes are square, rectangle, circle or triangle. Pick a shape and I will calculate its area. ")



#Calculating the area

def area(s):
   if str(s) == "square":
        x = int(raw_input("Height? "))        
        y = int(raw_input("Width?" ))
        squar(x, y)
        return squar
    elif str(s) == "rectangle":
        x = int(raw_input("Height? "))        
        y = int(raw_input("Width?" ))
        rectangl(x,y)
        return rectrangl
    elif str(s) == "circle":
        r = int(raw_input("Radius?" ))
        circl(r)
        return circl
    elif str(s) == "triangle":
        h = int(raw_input("Height?" ))
        b = int(raw_input("Base Width?" ))
        triangl(h, b)
        return triangl

    else:
        print "I don't know that one"


print area

谢谢 ps。如果缩进看起来有点偏离 space 或两个,那是因为这里的格式。当我 运行 程序时,他们没有抛出任何错误。

您总共有 6 个错误需要修复:

  • area() class 中,删除所有 4 return 条指令。
  • 作为您在 area() return 值中调用的 4 个方法,您需要通过以下方式显示它们的结果:print method_name(arguments)
  • 最后,您必须正确实例化 class area()

修复上述错误的方法如下:

# Shapes
def squar(x, y):
    result = x * y
    return result

def rectangl(x, y):
    result = x * y
    return result

def circl(r):
    result = 3.14 * (r^2)
    return result

def triangl(h, b):
    result = (h^b * b)/2
    return result

s = raw_input("Shapes are square, rectangle, circle or triangle. Pick a shape and I will calculate its area. ")

# Calculating the area
def area(s):
    if str(s) == "square":
        x = int(raw_input("Height? "))        
        y = int(raw_input("Width?" ))
        print squar(x, y)
    elif str(s) == "rectangle":
        x = int(raw_input("Height? "))        
        y = int(raw_input("Width?" ))
        print rectangl(x,y)
    elif str(s) == "circle":
        r = int(raw_input("Radius?" ))
        print circl(r)
    elif str(s) == "triangle":
        h = int(raw_input("Height?" ))
        b = int(raw_input("Base Width?" ))
        print triangl(h, b)
    else:
        print "I don't know that one"

area(s)

你的主要问题很简单,你没有调用函数。

在你的最后一行 print area 你得到的是该函数在内存中的位置,你需要用你之前定义的变量 s 将它称为 print area(s) .

然后在你的函数中 area 你做同样的事情,不知何故你认为函数调用的结果神奇地保存在一个与函数同名的变量中,但事实并非如此在这种情况下,您需要做与您在 shape 函数中所做的相同的事情,将结果保存在变量中并 return 它,例如

result = squar(x,y)
return result

或者更好的是,return结果直接

return squar(x,y)

在 python 中,一切都是对象,包括函数,所以当您执行 return squar 时,您 return 正在创建一个函数对象。

您的代码的更正版本可能是:

#geometry program

#shapes

def rectangl(x, y):
    return  x * y

def circl(r):
    return 3.14 * (r**2)

def triangl(h, b):
    return (h^b * b)/2

#Calculating the area    

def area(s):
   if s == "square" or s == "rectangle":
        x = int(raw_input("Height? "))        
        y = int(raw_input("Width?" ))
        return rectangl(x, y)
    elif s == "circle":
        r = int(raw_input("Radius?" ))
        return circl(r)
    elif s == "triangle":
        h = int(raw_input("Height?" ))
        b = int(raw_input("Base Width?" ))
        return triangl(h, b)
    else:
        print "I don't know that one"

s = raw_input("Shapes are square, rectangle, circle or triangle. Pick a shape and I will calculate its area. ")
print area(s)       

你的代码的另一件事是你不需要在已经是字符串的东西中调用 str;正方形也是矩形,您可以对两者使用相同的功能; python 中的求幂是用 ** 完成的,比如 2**5;还有其他的东西,比如不是打印一条抛出异常的消息,但我把它留给你的口味

我认为您对函数名称及其 return 值感到困惑,这是从 How to Think Like a Computer Scientist 中学到的:

"In Python, a function is a named sequence of statements that belong together." "The return statement is followed by an expression which is evaluated. Its result is returned to the caller as the “fruit” of calling this function." 函数本身是一个对象,它的名字就像一个变量名,但它的名字表明了一段代码的入口点。这就是为什么当你调用 print 语句打印函数名时,它打印的是 function ... @ ....,你的真正目的是打印出它上次调用的 return 值。所以这是我认为你可以做的:

def area(s):
   if str(s) == "square":
        x = int(raw_input("Height? "))        
        y = int(raw_input("Width?" ))
        squar_return_value = squar(x, y)
        return squar_return_value
                 .
                 .
                 .

print area(s)

'squar_return_value =' 处的赋值将创建一个变量名,该变量名与对象 return 通过函数调用 "squar(x,y)" 关联,然后您可以像使用 x 一样使用 squar_return_value ,是的。 我希望这会帮助您理解函数名称和它的 return 值之间的区别。