向量乘法python

2024-10-01 04:48:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: self消息主题returninitdef错误required
3条回答

__mul__中,您这样做是出于某种原因:

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

它调用Vektor.__init__,只提供位置参数x,值为self.x + digeri.x,但没有为{}提供任何值,因此出现错误。 另外,这还试图将属性xVektor本身更改为一个对象,我无法想象这是您想要的。在

对我来说,不清楚您的return语句前面的两行应该做什么。同时这两条线都会产生你看到的错误。在

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

^{pr2}$

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

^{3}$

那么你的点积可能看起来像:

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

错误是由于

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

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

Vektor.__init__需要多少个参数?忽略self,它是两个-x和{}。在

当您编写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进行变异。在

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

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

相关问题 更多 >