variable valores valor usuario una teclado solicitar obtener numero introducir datos dato como capturar cadena python list sum

usuario - introducir valores python



Suma de Python() y valores no enteros (5)

Es posible que también deba implementar la función __radd__ , que representa "adición inversa" y se llama cuando los argumentos no pueden resolverse en la dirección "hacia adelante". Por ejemplo, x + y se evalúa como x.__add__(y) si es posible, pero si eso no existe, Python intenta y.__radd__(x) .

Dado que la función sum() comienza con el entero 0 , lo primero que hace es intentar evaluar:

0 + Foo(3)

lo cual requerirá que implementes Foo.__radd__ .

¿Existe una forma sencilla y rápida de usar sum () con valores no enteros?

Así que puedo usarlo así:

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

Intenté sobrescribir __add__ y __int__ , etc., pero aún no he encontrado una solución.

EDITAR:

La solución es implementar:

def __radd__(self, other): return other + self.bar

Como Will sugirió en su post. Pero como siempre, todos los caminos llevan a Roma, pero creo que esta es la mejor solución ya que no necesito __add__ en mi clase


Es un poco complicado: la función sum () toma el inicio y lo agrega al siguiente, y así sucesivamente.

Necesitas implementar el método __radd__ :

class T: def __init__(self,x): self.x = x def __radd__(self, other): return other + self.x test = (T(1),T(2),T(3),200) print sum(test)


Intente usar el método __int__ y luego __int__ cada elemento de su lista a la función int para obtener los valores:

class Foo(object): def __init__(self,bar): self.bar = bar def __int__(self): return self.bar mylist = [Foo(3),Foo(34),Foo(63),200] result = sum(map(int,mylist)) print(result)


O si no quieres importar nada,

result = reduce((lambda x,y:x+y), mylist)

Otra pequeña ventaja es que no tiene que declarar necesariamente un método __add__ como parte de sus objetos Foo, si esta es la única circunstancia en la que desearía hacer una adición. (Pero probablemente no estaría mal definir a __add__ para la flexibilidad futura).


Tratar:

import operator result=reduce(operator.add, mylist)

sum () funciona probablemente más rápido, pero está especializado solo para números incorporados. Por supuesto, todavía tiene que proporcionar un método para agregar sus objetos Foo (). Así que el ejemplo completo:

class Foo(object): def __init__(self, i): self.i = i def __add__(self, other): if isinstance(other, int): return Foo(self.i + other) return Foo(self.i + other.i) def __radd__(self, other): return self.__add__(other) import operator mylist = [Foo(42), Foo(36), Foo(12), 177, Foo(11)] print reduce(operator.add, mylist).i