0

我是python初学者,正在练习一个简单的计算课。

这段代码假设当用户在命令行中输入 2 个数字和 1 个运算符时,它会告诉你答案。我只是想知道为什么它在函数 add()、subtract()、multiply() 和 divide() 中打印 4 行。我只是将它们放入字典中,而不是全部调用。有人可以为我解释一下吗?向我展示解决方案也很棒。提前致谢!

这是 windows power shell 的输出:

PS D:\misc\Code\python\mystuff> python .\CalculationTest.py
Please input a number:
>1
Please input a operator(i.e. + - * /):
>+
Please input another number:
>2
Adding 1 + 2         #why it shows these 4 lines?
Subtracting 1 - 2
Multiplying 1 * 2
Dividing 1 / 2
3

这是我的代码:

class Calculation(object):
def add(self, a, b):
    print "Adding %d + %d" % (a, b)
    return a + b

def subtract(self, a, b):
    print "Subtracting %d - %d" % (a, b)
    return a - b

def multiply(self, a, b):
    print "Multiplying %d * %d" % (a, b)
    return a * b

def divide(self, a, b):
    if b == 0:
        print "Error"
        exit(1)
    else:
        print "Dividing %d / %d" % (a, b)
        return a / b

def get_result(self, a, b, operator):
    operation = {
        "+" : self.add(a, b),        # I didn't mean to call these methods,
        "-" : self.subtract(a, b),   # but it seems that they ran.
        "*" : self.multiply(a, b),
        "/" : self.divide(a, b),
    }
    print operation[operator]

if __name__ == "__main__":
    print "Please input a number:"
    numA = int(raw_input(">"))

    print "Please input a operator(i.e. + - * /):"
    operator = raw_input(">")

    print "Please input another number:"
    numB = int(raw_input(">"))

    calc = Calculation()
    #print calc.add(numA, numB)
    calc.get_result(numA, numB, operator)
4

3 回答 3

2

你说你并不是要调用这些方法。但你做到了。你写

self.add(a, b)

并且调用,add因为它使用 call operator ()。在填充字典时,您正在调用每个算术运算符方法。

如果要捕获该方法而不是调用它,则需要将其self.add放入dict.

然后,当您确实想调用该方法时,您可以这样做:

print operation[operator](a, b)

此时我们正在使用调用运算符()并提供参数。

综上所述,您的函数如下所示:

def get_result(self, a, b, operator):
    operation = {
        "+" : self.add,      
        "-" : self.subtract, 
        "*" : self.multiply,
        "/" : self.divide,
    }
    print operation[operator](a, b)

由于dictnever 变化,将其设为类属性并仅初始化一次可能更明智。

在我看来,您的实例在这里没有多大用处。你不是指self任何地方。这表明这些方法作为静态方法可能会更好。

于 2013-02-19T08:59:50.093 回答
2

改为这样做:

def get_result(self, a, b, operator):
    operation = {
        "+" : self.add,
        "-" : self.subtract,
        "*" : self.multiply,
        "/" : self.divide,
    }
    print operation[operator](a, b)

(a, b)请注意在创建字典后实际的方法调用 (with ) 是如何移动到的。按照您的方式,您调用每个方法并将结果存储在字典中,而不是存储方法然后只调用您想要的方法。

于 2013-02-19T09:01:21.990 回答
0

以下代码:

operation = {
    "+" : self.add(a, b),        # I didn't mean to call these methods,
    "-" : self.subtract(a, b),   # but it seems that they ran.
    "*" : self.multiply(a, b),
    "/" : self.divide(a, b),
}

将热切地评估所有值,因为这就是 python 的工作方式。你想做:

operation = {
    "+" : self.add,
    "-" : self.subtract,
    "*" : self.multiply,
    "/" : self.divide,
}

然后调整其余代码以仅调用适当的方法。

如果您想以您的原始风格进行编码,您需要一种具有惰性求值语义的语言,例如 haskell。

于 2013-02-19T09:03:06.267 回答