-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

他の2つの答えは、ここで実際に行っているのは、関数を呼び出した結果ではなく、関数自体を出力しているという点で正しいです。ただし、このプログラムの構造を再考し、なぜここでクラスを使用しているのかを自問する必要があると思います。一般的に、クラスは、状態を持つもの、つまり、各インスタンスに関連付けられた1つ以上の変数である必要があります。これには、クラスをインスタンス化する必要があります。ただし、コードにはインスタンス化は含まれていません(__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 に答える