【问题标题】:Writing a Vector (Math) Class in Python用 Python 编写向量(数学)类
【发布时间】:2016-02-15 20:51:26
【问题描述】:

这是我的 Vector 类

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

它适用于以下方面:

v = Vector(1, 1, 1)

self.v 在哪里打印出一个列表

我将如何改变它:

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

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

【问题讨论】:

  • 让 u 和 v 成为向量。我应该让 u * v 成为使函数 dot(u,v) 计算点积的点积吗?

标签: python list class


【解决方案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

【讨论】:

  • 几乎... >>> Vector([1,1,1]).v [[1, 1, 1]]
  • 是的,我刚刚解决了这个问题 ;-)
  • 完美。我唯一要指出的是,传递一个字符串是完全有效的,因为这是一门数学课,可能值得为一个字符串抛出一个ValueError,但我们可以把它留给 OP
【解决方案2】:

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

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

    self.v = v

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

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

【讨论】:

    【解决方案3】:

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

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

    另请注意,此表达式可能会根据 v 的类型引发一些异常,因此作为一种更 Python 且更安全的方式,您最好使用 try-except 表达式来处理异常。

    from collections.abc import Iterable # In python 2.x collections import Iterable
    
        class Vector:
           def __init__(self, *v):
                try:
                    self.length = len(v)
                except TypeError:
                    self.v = v
                else:
                     if isinstance(v, Iterable):
                         self.v = v[0] if self.length == 1 else v
                     else:
                         self.v = v
    

    【讨论】:

    • 谢谢。这行得通。但是,在这种情况下,def __init__(self, *v): self.v = v[0] if len(v) == 1 else list(v) 对我有用。
    • @JohnVo 是的,但我添加了一个更完整的方法来处理所有情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多