在Python中模擬數值型別


Python包含內建的數學資料結構,例如複數、浮點數和整數。但有時我們可能想要開發我們自己的自定義行為的數字類。在這裡,模擬數字類的想法被付諸實踐。我們可以透過模擬它們來建立可以像原生數字類一樣使用的物件。在本文中,我們將瞭解如何在Python中模擬數字類。

示例1:模擬加法

class MyNumber:
   def __init__(self, x):
      self.x = x
   def __add__(self, other):
      return MyNumber(self.x + other.x)
a = MyNumber(2)
b = MyNumber(3)
c = a + b
print(c.x)

輸出

5

這裡,我們定義了一個自定義類MyNumber,它接收一個值x作為輸入。然後是`__add__`方法,當在兩個MyNumber例項之間使用+運算子時呼叫此方法。此方法返回一個新的MyNumber例項,其值為兩個輸入值的和。

示例2:模擬比較

class MyNumber:
   def __init__(self, x):
      self.x = x
   def __eq__(self, other):
      return self.x == other.x
a = MyNumber(2)
b = MyNumber(3)
c = MyNumber(2)
print(a == b)
print(a == c)

輸出

False
True

一個自定義類MyNumber,它接收一個值x作為輸入。然後我們定義`__eq__`方法,當在兩個MyNumber例項之間使用==運算子時呼叫此方法。如果兩個例項的值相等,此方法返回True,否則返回False。

模擬分數作為數值型別

讓我們檢查一個更全面的數字型別示例。建立一個名為Fraction的類,以分子和分母來表示分數。然後使用算術運算(如加、減、乘、除)以及如何比較數字來新增數值型別支援。

示例

class Fraction:
   def __init__(self, num, deno=1):
      self.num = num
      self.deno = deno
   def __str__(self):
      if self.deno == 1:
         return str(self.num)
      else:
         return "{}/{}".format(self.num, self.deno)
   def __add__(self, other):
      if isinstance(other, int):
         other = Fraction(other)
      common_deno = self.deno * other.deno
      num = self.num * other.deno + other.num * self.deno
      return Fraction(num, common_deno).simplify()
   def __sub__(self, other):
      if isinstance(other, int):
         other = Fraction(other)
      common_deno = self.deno * other.deno
      num = self.num * other.deno - other.num * self.deno
      return Fraction(num, common_deno).simplify()
   def __mul__(self, other):
      if isinstance(other, int):
         other = Fraction(other)
      num = self.num * other.nu
      deno = self.deno * other.deno
      return Fraction(num, deno).simplify()
   def __truediv__(self, other):
      if isinstance(other, int):
         other = Fraction(other)
      if isinstance(other, float):
         return float(self.num / self.deno) / other
      num = self.num * other.deno
      deno = self.deno * other.num
      return Fraction(num, deno)
   def gcd(self, a, b):
      if b == 0:
         return a
      else:
         return self.gcd(b, a % b)
   def simplify(self):
      divisor = self.gcd(self.num, self.deno)
      num = self.num // divisor
      deno = self.deno // divisor
      if deno < 0:
         num = -num
         deno = -deno
      return Fraction(num, deno)
      
# Create some Fraction objects
f1 = Fraction(2, 3)
f2 = Fraction(3, 4)
f3 = Fraction(1, 2)

# Perform some operations
print(f1 + f2) 
print(f2 - f3) 
print(f1 * f3) 
print(f1 / f2) 

輸出

17/12
1/4
1/3
8/9

Fraction類是一種巧妙的方式來對Fraction物件執行算術運算。我們將定義`__init__`、`__str__`、`__add__`、`__sub__`、`__mul__`和`__truediv__`方法來處理算術運算。此外,我們將定義兩個輔助方法gcd和simplify,它們幫助我們將分數簡化為最簡形式。

建立三個具有不同數字的Fraction物件後,`f1`、`f2`和`f3`——可以使用+、-、*和/運算子對這些物件執行各種操作,然後可以列印結果。需要注意的是,`__truediv__`函式接受任何形式的運算元,包括浮點數、整數和分數物件。如果另一個是浮點數,它會給出一個浮點結果;如果不是,則給出分數結果。因此,我們可以毫無風險地使用`f1 / 2.0`或`f2 / f3`之類的公式,並預期一個除法結果。

應用

  • 實現具有特定行為的**專用數值型別**(例如分數或複數)是模擬數值類別的一種用途。

  • 使用更有效的資料結構和方法來**提高數值計算的效率**。

  • 為**數值過程提供更具描述性**和可理解的詞彙將使程式碼更容易理解和管理。

結論

透過在Python中模擬數值型別,可以構建具有專門和定製行為的獨特數值型別,提高計算速度,並使程式碼更容易理解和管理。為了指定自定義型別的物件在進行算術運算時的行為,可以使用“魔術方法”或“dunder方法”,例如`__add__`、`__sub__`和`__truediv__`。所有這些都允許您以您想要的方式覆蓋預設行為,以便模擬對任何選擇的類或物件的數值型別操作。

更新於:2023年4月18日

456 次瀏覽

啟動您的職業生涯

完成課程後獲得認證

開始
廣告
© . All rights reserved.