向量乘法python

时间:2019-03-15 13:00:38

标签: python class vector multiplication

你好,我正在学习python,我得到了课程主题。 我收到了这样的错误消息:

"TypeError: __init__() missing 1 required positional argument: 'y'"

这是我的shell代码:

class Vektor():
    """ Bu bir vektör sınıfıdır"""
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def boyu(self):
        boy = (self.x**2+self.y**2)**0.5
        return boy
    def __repr__(self):
        return ("%di + %dy" %(self.x, self.y))
    def __sub__(self,digeri):
        return Vektor(self.x - digeri.x, self.y - digeri.y)
    def __add__(self,digeri):
        return Vektor(self.x + digeri.x, self.y + digeri.y)
    def __eq__(self,digeri):
        if self.boyu() == digeri.boyu(): return True
    def __mul__(self,digeri):
        self.x = Vektor(self.x + digeri.x)
        self.y = Vektor(self.y + digeri.y)
        return Vektor(self.x*digeri.x,self.y*digeri.y)

当我尝试像这样创建C = A * B时出现错误:

TypeError: init ()缺少1个必需的位置参数:“ y”

我已经谢谢你了,我想提醒我编程中的一个新话题:))

3 个答案:

答案 0 :(得分:2)

Vektor.__init__需要多少个参数?忽略self,它是两个-xy

return Vektor(self.x*digeri.x,self.y*digeri.y)时,您传递了两个参数,因此可行。

编写self.x = Vektor(self.x + digeri.x)时,此操作不起作用,因为您没有为y值传递第二个参数。

当Python给您错误时,它应该包含一个行号,该行号应显示错误发生的位置。您没有包括在内,但这是这一行,不是吗?

由于Vektor应该包含两个标量,并且有时不用两个向量替换它们,因此您可以编写

    self.x = self.x + digeri.x # still not a vector
    self.y = self.y + digeri.y # also not a vector

,但是更重要的一课是仔细阅读错误消息。您需要的一切都在那里。


关于运算符语义的注释:由于通常不会期望像x = v * w这样的表达式来修改x,因此无论如何您都不应该在运算符函数中对self进行突变。 / p>

您返回结果向量,就足够了。我向您展示了如何修复这两行的语法,但您实际上应该完全删除它们。

关于向量的另一条注释:*的重载并不是明显的胜利,因为对于标量数值类型而言,重载并不明显,因为向量通常具有不止一种可能的乘积类型。

答案 1 :(得分:1)

__mul__中,您由于某些原因而这样做:

self.x = Vektor(self.x + digeri.x)

正在调用Vektor.__init__,它仅提供位置自变量x,其值为self.x + digeri.x,而y则不提供任何值,因此出错。 同样,这试图将属性xVektor本身变成一个对象,我无法想象这正是您想要的。

对我来说,尚不清楚return__mul__语句前的两行应该做什么。而且这两行都会产生您看到的错误。

您的__mul__应该是点积吗?如果是这样,请尝试:

return self.x*digeri.x + self.y*digeri.y

对类的另一个简化可能是允许对坐标进行迭代,例如:

@property
def coords(self):
    return self.x, self.y

def __iter__(self):
    return self.coords.__iter__()

然后您的点积可能看起来像:

def dot(self, w):
    """ 
    The dot product of self and other vector w.
    """
    return sum([xi_s * xi_w for xi_s, xi_w in zip(self, w)])

VecPy,这是一个非常简单的示例类,可以执行此类操作。也许看看可以给您更多的想法。

答案 2 :(得分:0)

该错误是由于

self.x = Vektor(self.x + digeri.x)

当我们像编写语法的方式那样调用Vector时,它认为您想对其进行初始化,并且期望有两个输入。只需摆脱mul函数的前两行即可解决此问题。