0

演算子 +、-、、/、および *を受け入れる一般的なオーバーロードされた演算子関数を実行しています。演算子は、変数「op」として入ります。私の問題は、除算をゼロにすることです。2 番目の elif ステートメントは、これを実行しようとしている場所ですが、正確ではありません。私がカバーしようとしているのは 2 つのことです: 条件が true になることを許可し、self.list[L][0] == operand.list[R][0]次に、除算のときに右側のオペランドがゼロに等しくない場合 (つまりop == '/'operand.list[R][1] != 0)。false の場合は、else ステートメントに移動します。

def math(self, op, operand):
     obj = Object()         
    L, R = 0, 0     
        while (L < len(self.list) and R < len(operand.list)):
            if self.list[L][0] > operand.list[R][0]:
                R += 1
            elif self.list[L][0] < operand.list[R][0]:

                L += 1
            elif (self.list[L][0] == operand.list[R][0]) and op == '*' or op == '**' or op == '+' or op == '-' or (op == '/' and operand.list[R][1] != 0):
                obj.append(self.list[L][0], op(self.list[L][1], operand.list[R][1]))
                L += 1
                R += 1

            else:
                L += 1
                R += 1

    return obj
4

2 に答える 2

1

__add__クラスでは、演算子、__sub____mul__、および__div__カスタム動作を明示的にオーバーロードする必要があります。それ以外の場合、数学関数は呼び出されません。

class LoudObject(object):
    def __init__(self, val):
        """ How to initialize the object with a value """
        self.val = val

    def __repr__(self):
        """ How to represent the value when displayed """
        return "LoudObject(%d)" % (self.val,)

    def __add__(self, other):
        print "Look!  Addition!"
        return LoudObject(self.val + other.val)

    def __sub__(self, other):
        print "Subtraction!"
        return LoudObject(self.val - other.val)

    def __mul__(self, other):
        print "Multiplication!!!"
        return LoudObject(self.val * other.val)

    def __div__(self, other):
        print "Division!"
        if other.val == 0:
            print "uh-oh, division by zero.  No idea what I should do."
            print "Maybe no one will notice if I return -99999999"
            return LoudObject(-99999999)
        return LoudObject(self.val / other.val)

これで、次のように使用できます。

In [2]: LoudObject(3) + LoudObject(4)
Look! Addition!
Out[2]: LoudObject(7)

In [3]: LoudObject(3) / LoudObject(4)
Division!
Out[3]: LoudObject(0)

In [4]: LoudObject(3) / LoudObject(4.0)
Division!
Out[4]: LoudObject(0.75)

In [5]: LoudObject(3) / LoudObject(0)
Division!
uh-oh, division by zero.  No idea what I should do.
Maybe no one will notice if I return -99999999
Out[5]: LoudObject(-99999999)

明らかにこれはおもちゃの例です。このようなクラスを使用することはお勧めしません。また、ゼロ除算を大きな負のセンチネルで処理すると、後で問題が発生する可能性があります。

于 2013-06-01T05:52:45.973 に答える
1

おそらく、すべてのor節を括弧でまとめて囲む必要があります。

andよりも優先順位が高いためor、句:

(self.list[L][0] == operand.list[R][0]) and op == '*' or op == '**' or op == '+' or op == '-' or (op == '/' and operand.list[R][1] != 0)

として評価される

((self.list[L][0] == operand.list[R][0]) and op == '*') or op == '**' or op == '+' or op == '-' or (op == '/' and operand.list[R][1] != 0)

だからそれを

(self.list[L][0] == operand.list[R][0]) and (op == '*' or op == '**' or op == '+' or op == '-' or (op == '/' and operand.list[R][1] != 0))

トリックを行う必要があります。または、あなたがop言及したものの1つにしかなれないと確信している場合:

(self.list[L][0] == operand.list[R][0]) and (op != '/' or operand.list[R][1] != 0)

編集

コメントから、オペレーターのテストが正しくないと強く信じています。opが のような組み込み関数である場合は、div次のことを行う必要があります。

from operator import div, mul, pow, add, sub

そしてあなたの条件節で

(self.list[L][0] == operand.list[R][0]) and (op == mul or op == pow or op == add or op == sub or (op == div and operand.list[R][1] != 0))

また、

(self.list[L][0] == operand.list[R][0]) and (op != div or operand.list[R][1] != 0)
于 2013-06-01T05:08:49.300 に答える