Python中的向量

1 投票
5 回答
9763 浏览
提问于 2025-04-17 07:00

我正在做一个关于在Python中处理向量的项目。但是我对Python还很陌生,不太知道该怎么做。这里有个说明:

“给向量类添加一个构造函数。这个构造函数应该接受一个参数。如果这个参数是整数(int)或者长整型(long),或者是从这两者派生的类的实例,那么就把这个参数当作向量实例的长度。在这种情况下,创建一个指定长度的向量,里面的每个元素都初始化为0.0。如果长度是负数,就抛出一个ValueError,并给出合适的提示。如果这个参数不被视为长度,那么如果这个参数是一个序列(比如列表),就用这个序列的长度和数值来初始化向量。如果这个参数既不是用作向量的长度,也不是一个序列,就抛出一个TypeError,并给出合适的提示。”

接下来实现__repr__方法,返回一段Python代码的字符串,这段代码可以用来初始化这个向量。这个代码字符串应该包含类的名称,后面跟一个左括号,然后是用列表表示的向量内容,最后是一个右括号。”

我不太确定怎么进行类类型检查,以及如何根据给定的对象来初始化向量。有人能帮我吗?谢谢!

5 个回答

0

在StackOverflow上,有很多关于如何在Python中检查类型的例子(可以看看我评论里推荐的那个)。

要初始化一个类,可以使用 __init__ 方法:

class Vector(object):
    def __init__(self, sequence):
        self._internal_list = list(sequence)

现在你可以调用:

my_vector = Vector([1, 2, 3])

Vector 类的其他函数中,你可以使用 self._internal_list。我在变量名前加了一个 _,这是为了表示这个变量不应该在类外被修改。

关于 list 函数的 文档 可能对你有帮助。

0

这里有你开始学习所需的所有内容:http://docs.python.org/library/functions.html

2

你的老师似乎对“Python”这门语言不太熟悉。;) 这门课的整个概念其实有点搞笑;真正的Python程序员通常直接使用内置的序列类型。不过,这种事情在学术练习中是很常见的,遗憾的是……

给Vector类添加一个构造函数。

在Python中,创建新对象和指定它属于哪个类的过程是自动处理的。然后,这个新对象会被传递给类的初始化方法,以便将其变成一个“合适”的实例,方法是设置这个类的新实例应该具备的属性。我们把这个方法叫做__init__

构造函数应该接受一个参数。如果这个参数是整数(int)或长整数(long),或者是从这些类派生的实例

这可以通过使用内置函数isinstance来测试。你可以在文档中查找这个函数(或者在REPL中试试help(isinstance))。

在这种情况下,构造一个指定长度的Vector,每个元素初始化为0.0。

在我们的__init__方法中,通常只是为属性赋初始值。__init__的第一个参数是我们正在初始化的新对象,我们通常称之为“self”,这样大家就能明白我们在做什么。其余的参数是调用者请求实例时传入的内容。在我们的例子中,我们总是期待正好一个参数。这个参数可能有不同的类型和含义,所以我们应该给它一个通用的名字。

当我们用isinstance检测到这个通用参数是整数类型时,我们就通过设置合适的数据来“构造”这个向量。我们只需将值赋给self的某个属性(可以根据需要命名),然后这个值将会是……嗯,你打算用什么来表示向量的数据呢?希望你已经考虑过这个问题了 :)

如果长度是负数,就抛出一个ValueError,并给出合适的提示信息。

哦,这个提醒很好……我们应该在尝试构造存储之前检查这一点。处理负数的明显方法基本上是把它当作零来处理。其他方法可能会抛出一个我们无法控制的异常。

如果参数不被视为长度,那么如果参数是一个序列(比如列表),就用给定序列的长度和数值来初始化向量。

所谓“序列”是一个比较模糊的概念;列表、元组等没有一个“序列”的基类,所以我们不能轻易用isinstance来检查。(毕竟,有人可能会发明一种我们没想到的新序列)。检查某个东西是否是序列的最简单方法是尝试用内置的iter函数为它创建一个迭代器。如果这个东西不可迭代,iter会抛出一个比较有意义的TypeError(试试吧!),这样错误处理就简单了——我们只需让它自己处理。

假设我们得到了一个迭代器,我们可以轻松创建我们的存储:大多数序列类型(我想你心里已经有一个了,肯定包括在内)会接受一个迭代器作为它们的__init__方法的参数,并做出复制序列数据的明显操作。

接下来实现__repr__方法,返回一段Python代码字符串,这段代码可以用来初始化Vector。这个字符串应该由类名、一个左括号、表示向量内容的列表、再加一个右括号组成。

希望这个说明不言自明。提示:你应该能通过利用存储属性自己的__repr__来简化这个过程。还可以考虑使用字符串格式化来拼接这个字符串。

撰写回答