用Python编写矢量(数学)类

时间:2016-02-15 20:51:27

标签: python list class

这是我的Vector类

class Vector:
   def __init__(self, *v):
        self.v = v

它非常适用于以下内容:

v = Vector(1, 1, 1)

其中self.v打印出一个列表

我如何改变它:

v = Vector([1, 1, 1]) 

它打印出一个列表。 目前,它打印出列表中的列表。

3 个答案:

答案 0 :(得分:1)

from collections import Iterable

class Vector:
    def __init__(self, *v):
        if len(v) == 1 and isinstance(v[0], Iterable) and not isinstance(v[0], str):
            # iterable (but not string) - cast to list
            self.v = list(v[0])
        else:
            self.v = v

答案 1 :(得分:0)

由于*v会给出多个位置参数,如果您不想丢失此属性,可以检查v的长度为1,然后将第一个项目分配给{{ 1}}:

self.v

另请注意,此表达式可能会基于class Vector: def __init__(self, *v): self.v = v[0] if len(v) == 1 else v 的类型引发一些异常。因此,您可以更好地使用v表达式来处理异常,从而更加pythonic和更安全。

try-except

答案 2 :(得分:0)

如果您希望类在传递单个列表时的行为与传递多个数字时的行为不同,则需要在__init__方法中添加一些条件逻辑。这样的事情可能有用(虽然还有其他方法可以进行检查):

def __init__(self, *v):
    if len(v) == 1:
        v = v[0]

    self.v = v

显然,这对于一维向量不会如预期的那样工作(v将被设置为单个标量值,而不是1值列表)。您可以使用isinstance来确保单个值实际上是一个列表或元组,如果您愿意,但我怀疑仍然会出现尴尬的角落情况,您会出错。

更好的方法可能是更改要在列表中传递的代码。如果不是Vector([1,1,1]),而是Vector(*[1,1,1]),那么您现有的代码就可以正常使用。