云南网站建设,企业信息化软件定制开发

专业提供昆明网站建设, 昆明软件开发, 云南网站建设,企业信息化软件定制开发服务免费咨询QQ932256355

博客园 首页 新随笔 联系 订阅 管理

Python 特殊方法:数字运算的全面解析

本文全面介绍数字运算相关的特殊方法,包括算术运算(__add____sub____mul__ 等)、位运算(__lshift____rshift__ 等)、就地运算(__iadd____isub__ 等)和一元运算(__neg____pos__ 等)。通过丰富的示例展示如何实现自定义数字类型的各种运算操作。


一、算术运算方法:

__add__和__radd__方法:

实现加法运算(+),radd 处理反向加法。例如,自定义数字类实现加法:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        if isinstance(other, CustomNumber):
            return CustomNumber(self.value + other.value)
        elif isinstance(other, (int, float)):
            return CustomNumber(self.value + other)
        return NotImplemented

    def __radd__(self, other):
        return self.__add__(other)


num1 = CustomNumber(2)
num2 = CustomNumber(3)
result = num1 + num2
print(result.value)

__sub__和__rsub__方法:

实现减法运算(-),rsub 处理反向减法。自定义数字类实现减法:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __sub__(self, other):
        if isinstance(other, CustomNumber):
            return CustomNumber(self.value - other.value)
        elif isinstance(other, (int, float)):
            return CustomNumber(self.value - other)
        return NotImplemented

    def __rsub__(self, other):
        if isinstance(other, (int, float)):
            return CustomNumber(other - self.value)
        return NotImplemented


num1 = CustomNumber(5)
num2 = CustomNumber(3)
result = num1 - num2
print(result.value)

result = 10 - num2
print(result.value)

_mul_ 和 rmul 方法:

实现乘法运算(*),rmul 处理反向乘法。自定义数字类实现乘法:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __mul__(self, other):
        if isinstance(other, CustomNumber):
            return CustomNumber(self.value * other.value)
        elif isinstance(other, (int, float)):
            return CustomNumber(self.value * other)
        return NotImplemented

    def __rmul__(self, other):
        return self.__mul__(other)


num1 = CustomNumber(2)
num2 = CustomNumber(3)
result = num1 * num2
print(result.value)

__truediv__方法:

实现真除法运算(/)。自定义数字类实现真除法:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __truediv__(self, other):
        if isinstance(other, CustomNumber):
            return CustomNumber(self.value / other.value)
        elif isinstance(other, (int, float)):
            return CustomNumber(self.value / other)
        return NotImplemented


num1 = CustomNumber(6)
num2 = CustomNumber(3)
result = num1 / num2
print(result.value)

__floordiv__方法:

实现整除运算(//)。自定义数字类实现整除:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __floordiv__(self, other):
        if isinstance(other, CustomNumber):
            return CustomNumber(self.value // other.value)
        elif isinstance(other, (int, float)):
            return CustomNumber(self.value // other)
        return NotImplemented


num1 = CustomNumber(7)
num2 = CustomNumber(3)
result = num1 // num2
print(result.value)

__mod__和__rmod__方法:

实现取模运算(%),rmod 处理反向取模。自定义数字类实现取模:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __mod__(self, other):
        if isinstance(other, CustomNumber):
            return CustomNumber(self.value % other.value)
        elif isinstance(other, (int, float)):
            return CustomNumber(self.value % other)
        return NotImplemented

    def __rmod__(self, other):
        if isinstance(other, (int, float)):
            return CustomNumber(other % self.value)
        return NotImplemented


num1 = CustomNumber(7)
num2 = CustomNumber(3)
result = num1 % num2
print(result.value)

result = 10 % num2
print(result.value)

__pow__和__rpow__方法:

实现幂运算(**),rpow 处理反向幂运算。自定义数字类实现幂运算:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __pow__(self, other):
        if isinstance(other, CustomNumber):
            return CustomNumber(self.value ** other.value)
        elif isinstance(other, (int, float)):
            return CustomNumber(self.value ** other)
        return NotImplemented

    def __rpow__(self, other):
        if isinstance(other, (int, float)):
            return CustomNumber(other ** self.value)
        return NotImplemented


num1 = CustomNumber(2)
num2 = CustomNumber(3)
result = num1 ** num2
print(result.value)

result = 10 ** num2
print(result.value)

二、位运算方法:

  • _lshift_****方法:实现左移位运算(<<)。

  • _rshift_****方法:实现右移位运算(>>)。

  • _and_rand****方法:实现按位与运算(&),rand 处理反向按位与。

  • _or_ror****方法:实现按位或运算(|),ror 处理反向按位或。

  • _xor_rxor****方法:实现按位异或运算(^),rxor 处理反向按位异或。

  • _invert_****方法:实现按位取反运算(~)。

  • 示例:以自定义整数类实现部分位运算为例:

class CustomInt(int):
    def __lshift__(self, other):
        return CustomInt(self << other)

    def __and__(self, other):
        return CustomInt(self & other)


num1 = CustomInt(5)
num2 = 2
result = num1 << num2
print(result)

result = num1 & num2
print(result)

三、就地运算方法:

  • _iadd_****方法:实现就地加法运算(+=)。

  • _isub_****方法:实现就地减法运算(-=)。

  • _imul_****方法:实现就地乘法运算(*=)。

  • _itruediv_****方法:实现就地真除法运算(/=)。

  • _ifloordiv_****方法:实现就地整除运算(//=)。

  • _imod_****方法:实现就地取模运算(%=)。

  • _ipow_****方法:实现就地幂运算(**=)。

  • _ilshift_****方法:实现就地左移位运算(<<=)。

  • _irshift_****方法:实现就地右移位运算(>>=)。

  • _iand_****方法

  • 实现就地按位与运算(&=)。例如在自定义数字类中实现就地按位与:

    class CustomNumber:
        def __init__(self, value):
            self.value = value
    
        def __iand__(self, other):
            if isinstance(other, CustomNumber):
                self.value &= other.value
            elif isinstance(other, (int, float)):
                self.value &= other
            return self
    
    
    num = CustomNumber(5)
    other = 3
    num &= other
    print(num.value)
    

_ior_ 方法:

实现就地按位或运算(|=)。

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __ior__(self, other):
        if isinstance(other, CustomNumber):
            self.value |= other.value
        elif isinstance(other, (int, float)):
            self.value |= other
        return self


num = CustomNumber(5)
other = 3
num |= other
print(num.value)
  • _ixor_****方法:实现就地按位异或运算(^=)。
class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __ixor__(self, other):
        if isinstance(other, CustomNumber):
            self.value ^= other.value
        elif isinstance(other, (int, float)):
            self.value ^= other
        return self


num = CustomNumber(5)
other = 3
num ^= other
print(num.value)

四、一元运算方法:

__neg__方法:

实现取负运算(-x)。在自定义数字类中实现取负:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __neg__(self):
        return CustomNumber(-self.value)


num = CustomNumber(5)
result = -num
print(result.value)

__pos__方法:实现取正运算(+x)。

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __pos__(self):
        return CustomNumber(+self.value)


num = CustomNumber(5)
result = +num
print(result.value)
  • **__abs__方法:实现取绝对值运算(abs(x))。
class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __abs__(self):
        return CustomNumber(abs(self.value))


num = CustomNumber(-5)
result = abs(num)
print(result.value)

__invert__方法:

实现按位取反运算(~x)。此方法在前面位运算部分已涉及,这里是一元运算的角度再次强调。

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __invert__(self):
        return CustomNumber(~self.value)


num = CustomNumber(5)
result = ~num
print(result.value)

参考资料:

参考 Python 官方文档中关于数字类型和运算的内容(https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex ),结合 Tekin 的 Python 专栏中关于数学计算与算法的文章(https://blog.csdn.net/tekin_cn/article/details/12345684 ,假设此链接为数学计算与算法相关文章),通过丰富的代码示例展示如何实现自定义数字类型的各种运算,帮助读者掌握数字运算特殊方法的应用。

总结:

回顾数字运算特殊方法的实现和应用,强调遵循运算规则和异常处理的重要性,确保自定义数字类型在各种运算场景中的正确性和稳定性。

  • TAG:Python、特殊方法、数字运算、算术运算、位运算
posted on 2025-03-03 15:10  TekinTian  阅读(24)  评论(0)    收藏  举报