向量 class 上的 __iter__ 和 __next__ 正在做一些奇怪的事情

__iter__ and __next__ on vector class is doing some weird stuff

我有一个向量 class 我一直在构建

# vector.py
class Vector(object):
    def __init__(self, vec:list):
        self._vector = vec
        self._size   = len(vec)

    def __iter__(self):
        self._index = 0
        return self

    def __next__(self):
        if self._index < self._size:
            self._index += 1
            return self._index-1
        else:
            raise StopIteration

代码比这多得多,我还实现了一个 __getitem__ dunder 函数。 我在测试文件中玩耍,想在不使用 python sum() 函数的情况下对向量求和。

from functools import reduce
import vector

vec = vector.Vector([1, 2, 3, -4])
print(reduce(lambda x,y: x+y, vec))

# I would expect 2 to be returned but got 6 instead.
# So I tried something else instead

print(reduce(lambda x,y: x+y, [1, 2, 3, -4]))
# This returns 2 like expected.

所以我不知道为什么当我传递 reduce() 一个 python 列表而不是向量 class 时它会起作用。我想这与我实现 __iter____next__ 的方式有关。大家怎么看?

__next__ 的实现中,您将返回索引而不是 元素 [0, 1, 2, 3] 正在生成,总计为 6。

修复:

    def __iter__(self):
        self._index = 0
        return self

    def __next__(self):
        if self._index < self._size:
            self._index += 1
            return self._vec[self._index-1]
            #      ^^^^^^^^^^             ^
        else:
            raise StopIteration