[Python] Operatore sum
Daniele Varrazzo
piro a develer.com
Mar 17 Feb 2009 11:50:40 CET
On Tue, 17 Feb 2009 09:48:30 +0100, Luca Bacchi <bacchilu a gmail.com> wrote:
> Esiste un protocollo per l'operatore 'sum'?
No, cosa fare è spiegato nella sua documentazione (forse sono le
implicazioni a non essere chiare):
sum(sequence, start=0) -> value
Returns the sum of a sequence of numbers (NOT strings) plus the value
of parameter 'start'. When the sequence is empty, returns start.
c'è un parametro start, che vale 0. sum non inizia sommando i primi due
elementi della lista, ma sommando start col primo elemento della lista.
> Questo è quello che vorrei, più o meno:
>
> class A(object):
> def __init__(self, v):
> self.v = v
>
>
> sum([A(1), A(2), A(3)])
>
> dove il risultato dovrebbe essere 6, ossia la somma delle varie
proprietà
> 'v'.
Basta fornire uno "start" sensibile:
In [8]: class A(object):
def __init__(self, v):
self.v = v
def __add__(self, other):
return A(self.v + other.v)
....:
....:
In [14]: sum([A(1), A(2), A(3)], A(0)).v
Out[14]: 6
Alternativamente, puoi definire __add__ in maniera che supporti la somma A
+ int, nel qual caso va bene anche lo "start" di default.
Un altro esempio: puoi usare sum per concatenare una lista di liste, ma
devi usare una lista vuota come "start":
In [16]: LL = [ range(i) for i in range(5) ]
In [17]: LL
Out[17]: [[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]
In [18]: sum(LL, [])
Out[18]: [0, 0, 1, 0, 1, 2, 0, 1, 2, 3]
Ciao!
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
Maggiori informazioni sulla lista
Python