【问题标题】:Vector multiplication python向量乘法python
【发布时间】:2019-03-15 13:00:38
【问题描述】:

你好,我正在学习 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'

我已经谢谢你了,我想提醒一下我是编程新手 :))

【问题讨论】:

  • 你可以去掉 __mul__ 的前两行,只留下def __mul__(self, digeri): return Vektor(self.x * digeri.x, self.y * digeri.y)
  • 如果您向我们解释什么是“向量乘法”,也许会有所帮助。它不能是dot product,因为点积返回一个标量,而不是一个向量。并且不能是cross product,因为叉积需要三个维度的向量。 __mul__ 真正想要做什么?

标签: python class vector multiplication


【解决方案1】:

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

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

关于向量的另一个注意事项:重载* 并没有像对于标量数值类型那样明显的胜利,因为向量通常有不止一种可能的乘积类型。

【讨论】:

  • 我很好奇他为什么首先要变异 self.x 和 self.y。理想情况下,二元运算符重载应该没有副作用。
【解决方案2】:

__mul__ 你出于某种原因这样做:

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

调用Vektor.__init__ 只提供位置参数x,其值为self.x + digeri.x,但没有y,因此出现错误。 这也试图将属性x 更改为Vektor 本身的对象,我无法想象这是你想要的。

对我来说,不清楚__mul__return 语句之前的两行应该做什么。这两行也会产生你看到的错误。

您的__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,一个非常简单的示例类,可以做这种事情。也许看看可以给你更多的想法。

【讨论】:

    【解决方案3】:

    错误是由于

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

    当我们以编写语法的方式调用 Vector 时,它认为您想要初始化它并且它需要两个输入。只需去掉 mul 函数的前两行即可解决问题。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2014-09-22
      • 1970-01-01
      • 2020-10-29
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2016-07-18
      相关资源
      最近更新 更多