0

私はPythonの初心者で、簡単な計算クラスを練習しています。

このコードは、ユーザーがコマンドラインに2つの数字と1つの演算子を入力すると、答えが表示されることを前提としています。関数add()、subtract()、multiply()、divide()で4行を出力するのはなぜだろうか。すべてを呼び出すのではなく、辞書に入れるだけです。誰かが私のためにそれを説明してもらえますか?解決策も教えていただければ幸いです。前もって感謝します!

WindowsPowerShellからの出力は次のとおりです。

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演算子を使用するため、呼び出します()。辞書にデータを入力するときに、それぞれの算術演算子メソッドを呼び出しています。

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)

決して変化しないので、dictそれをクラス属性にして、一度だけ初期化する方が賢明かもしれません。

あなたのインスタンスがここで非常に役立つように私には見えません。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 に答える