-1

我正在尝试用python制作一个非常简单的计算器。在只使用函数之前,我已经做了一个工作,但事实证明添加类很困难。

def askuser():
    global Question, x, y

    Question = input("""Enter a word: ("Add", "Subtract", "Multiply", "Divise")""")
    x = int(input("Enter first number: "))
    y = int(input("Enter second number: "))

class calculating:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

    def subtract(self):
        return self.x - self.y

    def multiplication(self):
        return self.x * self.y

    def division(self):
        return self.x / self.y

math = calculating

def calc():

    if Question == "Add":
        t = math.add
        print(t)

    elif Question == "Subtract":
        t = math.subtract
        print(t)

    elif Question == "Multiply":
        t = math.multiplication
        print(t)

    elif Question == "Division":
        t = math.division
        print(t)

def final():
    input("Press any key to exit:" )


def main():

    askuser()
    calc()
    final()

main()

代码运行良好,但它给了我一个“错误”而不是输出一个计算:

   Enter a word: ("Add", "Subtract", "Multiply", "Divise")Add

   Enter first number: 5

   Enter second number: 5

   function add at 0x02E4EC90

   Press any key to exit:

为什么会这样?任何帮助都会很棒,谢谢。

4

3 回答 3

2

您正在打印函数本身,而不是调用它的结果。尝试:

def calc():

if Question == "Add":
    t = math.add

elif Question == "Subtract":
    t = math.subtract

elif Question == "Multiply":
    t = math.multiplication

elif Question == "Division":
    t = math.division

print t()

或者更干净但更高级:

class UserInputCalculator(object):

    operations = ["Add", "Subtract", "Multiply", "Divide"]

    def __init__(self):
        self.x = None
        self.y = None
        self.operation = None

    def run(self):
        self.prompt_for_operation()
        self.prompt_for_x()
        self.prompt_for_y()
        if self.operation == 'Add':
            return self.add()
        elif self.operation == 'Subtract':
            return self.subtract()
        elif self.operation == 'Multiply':
            return self.multiply()
        elif self.operation = 'Divide':
            return self.divide()
        else:
            raise ValueError('Unknown operation %s.' % operation)

    def prompt_for_operation(self):
        self.operation = input("Enter an operation: (%s)" % ', '.join(UserInputCalculator.operations))
        if self.operation not in UserInputCalculator.operations:
            raise ValueError('%s not a valid operation.' % self.operation)
        return self.operation

    def prompt_for_x(self):
        try:
            self.x = int(input("Enter first number: "))
        except:
            raise ValueError('Invalid value.')
        return self.x

    def prompt_for_y(self):
        try:
            self.y = int(input("Enter second number: "))
        except:
            raise ValueError('Invalid value.')
        return self.y

    def add(self):
        return self.x + self.y

    def subtract(self):
        return self.x - self.y

    def multiply(self):
        return self.x * self.y

    def divide(self):
        return self.x / self.y

calculator = UserInputCalculator()
print calculator.run()
input("Press any key to exit:" )
于 2013-01-11T17:41:30.993 回答
1

该行:

t = math.multiplication

将函数对象分配math.multiplication给 t,然后在下一行打印它。您需要添加()以使函数实际执行:

t = math.multiplication()
于 2013-01-11T17:43:00.257 回答
0

其他两个答案是正确的,您实际上在这里所做的是打印函数本身,而不是调用它的结果。不过,我认为您应该重新考虑该程序的结构,并问自己为什么在这里使用类。一般来说,类应该是具有状态的东西,即与每个实例相关联的一个或多个变量。这需要实例化类;但是,您的代码不包含实例化(即使您定义了一个__init__函数);该行math = calculating只是将变量math转换为对引用calculating而不是班上)。您使用的是全局变量而不是类变量,如果您以后想将此模块作为更大程序的一部分导入,这可能会出现问题(实际上,全局变量在大多数情况下通常不是一个好主意)。

因此,我建议将函数视为接受一组特定变量并返回其他一组变量的东西,而不是这种结构。这不是考虑函数的唯一方法,但在这个简单的计算器示例中,它可能是最好的方法。

让我们从上往下看。您的main函数可能如下所示:

def main():
    (q,x,y) = askuser()
    ans = math[q](x,y)
    final(ans)

请注意,我在这里所做的是将每个函数的结果传递给下一个函数。另请注意,我现在有不同的语法来使用math; 我将使用函数字典而不是函数类。

那么让我们看看如何实现main. 首先,askuser将与代码中的原始版本相同,但包含global声明。

其次,math将是一个字典,定义如下:

def add(x,y):
    return x + y

def subtract(x,y):
    return x - y

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

def divide(x,y):
    return x / y

math = {"Add" : add,
        "Subtract" : subtract,
        "Multiply" : multiply,
        "Divide" : divide}

最后,final应该实际打印答案:

def final(ans):
    print ans
    input("Press any key to exit:" )

这通常比您的解决方案干净得多。但是,如果您想学习如何很好地使用类,它对您没有多大帮助。所以想想你到底想要你的类的状态是什么,然后以这种方式实现你的代码。例如,您可以通过calculator这种方式添加一个类:

class calculator:
    def compute(x,y):
        print "No operation defined!"

    def __init__(self,operation):
        if operation in math:
            self.compute = math[operation]
        else:
            print "%s is not a valid operation!"%operation

main然后看起来像这样:

def main():
    (q,x,y) = askuser()
    mycalc = calculator(q)
    ans = mycalc(x,y)
    final(ans)
于 2013-01-11T18:13:38.957 回答