Python 3: aplicar un operador sobre un iterable

sum(iterable) es efectivamente:

 def sum(iterable): s = 0 for x in iterable: s = s.__add__(x) return s 

¿Python tiene una función incorporada que logra esto sin establecer el valor inicial?

 # add is interchangeable with sub, mul, etc. def chain_add(iterable): iterator = iter(iterable) s = next(iterator) while True: try: s = s.__add__(next(iterator)) except StopIteration: return s 

El problema que tengo con la sum es que no funciona para otros tipos que admiten el operador + , por ejemplo, Counter .

Intente buscar en la función python reduce() : pasa una función, una iterable y un inicializador opcional y aplicaría la función de forma acumulativa a todos los valores.

Por ejemplo:

 import functools def f(x,y): return x+y print functools.reduce(f, [1, 2, 3, 4]) # prints 10 print functools.reduce(f, [1, 2, 3, 4], 10) # prints 20, because it initializes at 10, not 0. 

Puedes cambiar la función según tu iterable, por lo que es muy personalizable.

En el caso de la adición:

 import operator reduce(operator.add, iterable) 

Esto funcionará en iterables que no se pueden sumr usando sum . Del mismo modo, podrías realizar la multiplicación usando

 reduce(operator.mul, iterable) 

Este es un uso bastante bueno para reduce() , que se movió a functools.reduce() en Python 3.

Aquí hay un ejemplo para encadenar la multiplicación:

 import functools import operator def chain_mul(iterable): return functools.reduce(operator.mul, iterable) 

Puede reemplazar operator.mul allí con una de las otras funciones del módulo del operador , o simplemente definir su propia función de dos argumentos que opera en sus argumentos.