向量 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
我有一个向量 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