【问题标题】:how to construct a class for complex number in python?如何在python中为复数构造一个类?
【发布时间】:2015-01-24 19:36:53
【问题描述】:

首先,我知道 scipy 中有复数的数据结构。我只是在关注一本计算物理教科书,这是其中一个问题。 到目前为止,这就是我所拥有的:

class complex:
    def __init__(self,x,y):
        self.re=x
        self.im=y
    def __add__(self, other):
        return complex(self.re+other.re, self.im+other.im)
    def __sub__(self, other):
        return complex(self.re-other.re, self.im-other.im)        
    def __mul__(self, other):
        return complex(self.re*other.re - self.im*other.im, 
        self.re*other.im + self.im*other.re)        
    def __repr__(self):
        return '(%f , %f)' %(self.re, self.im)

但是我应该如何在我创建的类中实现除法、复共轭、模数和相位?

谢谢

【问题讨论】:

  • 您知道数学上如何用复数执行这些运算吗?如果是这样,您在用 Python 实现它时遇到了什么问题?如果您的问题是如何执行这些操作,那是 Stack Overflow 的题外话。
  • 我在处理复数方面没有问题。我只是不知道如何在 python 中实现它们。
  • 你已经找到了基本的算术特殊方法;你的意思是你也想知道如何加入除法和模数运算符吗?从你的问题中不清楚你到底在这里挣扎什么。
  • 它没有回答您的问题,但请注意,复数不需要 Scipy,它们是 Python 中的内置类型。 docs.python.org/2.7/reference/…

标签: python class methods data-structures complex-numbers


【解决方案1】:

你应该用__div__ 实现除法,用__abs__ 实现模数。复杂的共轭和相位,您必须选择自己的方法名称。例如,

def conj(self):
    return complex(self.re, - self.im)

(使用z.conj() 调用)。请注意,您将无法为您的类定义新的 Python 语法:例如,您无法使 z* 工作。如果您愿意,还应该使用__rmul____pow__ 定义右乘法。不要忘记一元减号,__neg__。但并非所有其他双下划线运算符方法都可以用复数实现。有a list in the docs

【讨论】:

  • 我不确定我是否同意您对__div____abs__ 的初步建议。我建议__truediv__ 用于除法(如果您想支持// 除法运算符,也可以使用__floordiv__),__mod__ 用于模数。在 Python 3 中实现除法需要 __truediv__,在 Python 2 中也是一个好主意(与 from __future__ import division 一起使用)。对于复共轭,重用一元 ~ 运算符可能是有意义的,它返回整数的按位求逆。它可以通过定义__inverse__ 方法在自定义类中实现。
  • 我同意__truediv__ 的完整性。但是__mod__ 实现了模数运算的% 中缀:这个和下除法对于复数肯定没有意义。不过,对复共轭重用 ~ 是可行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2012-07-28
  • 2017-01-05
  • 1970-01-01
  • 2013-09-10
  • 2015-05-08
相关资源
最近更新 更多