是否有一种简单快捷的方法将sum()与非整数值一起使用?
所以我可以像这样使用它:
class Foo(object):
def __init__(self,bar)
self.bar=bar
mylist=[Foo(3),Foo(34),Foo(63),200]
result=sum(mylist) # result should be 300
Run Code Online (Sandbox Code Playgroud)
我试着重写__add__和__int__等,但我没有找到一个解决办法
编辑:
解决方案是实现:
def __radd__(self, other):
return other + self.bar
Run Code Online (Sandbox Code Playgroud)
正如威尔在他的帖子中所说.但一如既往,所有道路都通往罗马,但我认为这是最好的解决方案,因为我不需要__add__在课堂上
我正在使用实现__add__但不是子类的Python对象int.MyObj1 + MyObj2工作正常,但sum([MyObj1, MyObj2])导致了TypeError,因为sum()第一次尝试0 + MyObj.为了使用sum(),我的对象需要__radd__处理MyObj + 0 或者我需要提供一个空对象作为start参数.有问题的对象不是空的.
在有人要求之前,该对象不像列表或类似字符串,因此使用join()或itertools无济于事.
编辑以获取详细信息:模块具有SimpleLocation和CompoundLocation.我将把位置缩写为Loc.A SimpleLoc包含一个右开间隔,即[开始,结束].添加SimpleLoc产量a CompoundLoc,其中包含间隔列表,例如[[3, 6), [10, 13)].最终用途包括遍历联合,例如[3, 4, 5, 10, 11, 12],检查长度和检查成员资格.
数字可以相对较大(例如,小于2 ^ 32但通常为2 ^ 20).间隔可能不会非常长(100-2000,但可能更长).目前,仅存储端点.我现在暂时想到尝试子类化set,使得该位置被构造为set(xrange(start, end)).但是,添加集将使Python(和数学家)适合.
我看过的问题:
我正在考虑两种解决方案.一种是避免sum()和使用本评论中提供的循环.我不明白为什么sum()开始将iterable的第0项添加到0而不是添加第0和第1项(如链接注释中的循环); 我希望有一个神秘的整数优化原因.
我的另一个解决方案如下; 虽然我不喜欢硬编码的零检查,但这是我能够sum()工作的唯一方式.
# ... …Run Code Online (Sandbox Code Playgroud) 我正在尝试在sum()对象列表上使用内置函数并作为结果获取对象.
这是我的代码的摘录:
class vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return vector(self.x+other.x, self.y+other.y)
l = []
l.append(vector(3, 5))
l.append(vector(-2, 3))
l.append(vector(0,-4))
net_force = sum(l)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
TypeError: unsupported operand type(s) for +: 'int' and 'instance'
Run Code Online (Sandbox Code Playgroud)
我想这是因为sum()最初将结果设置为0然后遍历列表,但我只能定义添加内容vector,而不是相反.
我试图找出是否有可能在python类上定义算术运算。我想做些什么:
class a():
@classmethod
def __add__(cls, other):
pass
a + a
Run Code Online (Sandbox Code Playgroud)
但是,我当然知道:
TypeError: unsupported operand type(s) for +: 'type' and 'type'
这样的事情有可能吗?