Python 3:在iterable上应用运算符
Python 3:在iterable上应用运算符,python,python-3.x,operators,iterable,Python,Python 3.x,Operators,Iterable,sum(iterable)实际上是: def sum(iterable): s = 0 for x in iterable: s = s.__add__(x) return s Python是否有一个内置函数,可以在不设置初始值的情况下实现这一点 # add is interchangeable with sub, mul, etc. def chain_add(iterable): iterator = iter(iterable) s
sum(iterable)
实际上是:
def sum(iterable):
s = 0
for x in iterable:
s = s.__add__(x)
return s
Python是否有一个内置函数,可以在不设置初始值的情况下实现这一点
# 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
我对
sum
的问题是,它不适用于支持+
运算符的其他类型,例如计数器
尝试查看python:传入一个函数、一个iterable和一个可选的初始值设定项,它会将函数累积应用于所有值
例如:
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.
您可以根据您的iterable更改函数,因此它是非常可定制的。在添加的情况下:
import operator
reduce(operator.add, iterable)
这将适用于无法使用sum
添加在一起的iterables。类似地,您可以使用
reduce(operator.mul, iterable)
这是
reduce()
的一个很好的用法,在Python 3中它被移动到了
以下是链式乘法的示例:
import functools
import operator
def chain_mul(iterable):
return functools.reduce(operator.mul, iterable)
您可以将那里的
operator.mul
替换为模块中的其他函数之一,或者只定义自己的两个参数函数,对其参数进行操作。这是一个很好的帮助,尽管reduce不是经常与第三个“初始”参数一起使用吗?例如,对于加法,它是0,对于乘法,它是1,对于字符串,它应该是“”(但字符串不能很好地相加)。它可以是,但不一定是。如果未给出任何值,则将从2开始的每个值与原始值相加。(如果iterable中没有任何内容,它会为没有初始值的空序列的TypeError:reduce()抛出异常