Python 3.x 在python中,lambda函数如何与reduce函数一起工作?
我正在尝试运行以下代码:Python 3.x 在python中,lambda函数如何与reduce函数一起工作?,python-3.x,lambda,reduce,Python 3.x,Lambda,Reduce,我正在尝试运行以下代码: print(reduce(lambda x, y: x + y, [1,2,3,4,5])) O/p->15 什么是x和y?这里的蓄能器是哪一个?累加器是否始终必须是第一个参数(即此处的x) 没有进行初始化时会发生什么情况?选择的默认值是什么?此代码的扩展形式,可能更容易理解 lst = [1, 2, 3, 4, 5] x = 0 # Default value for i in lst: y = i x = x + y print(x) 或者,
print(reduce(lambda x, y: x + y, [1,2,3,4,5]))
O/p->15
什么是x
和y
?这里的蓄能器是哪一个?累加器是否始终必须是第一个参数(即此处的x
)
没有进行初始化时会发生什么情况?选择的默认值是什么?此代码的扩展形式,可能更容易理解
lst = [1, 2, 3, 4, 5]
x = 0 # Default value
for i in lst:
y = i
x = x + y
print(x)
或者,如果考虑lambda函数:
lst = [1, 2, 3, 4, 5]
x = 0
def func(x,y):
x = x + y
return x
for i in lst:
x = func(x, i)
print(x)
如您所见,x
是这里的累加器。如果不将累加器指定为第一个参数,则无法使用reduce
方法
希望这能澄清你的代码是如何工作的
更新:@Wolf指出,我们可以为reduce方法的args指定一个初始值。将
x
更新为0,因为这是默认值。我认为的文档非常可读。执行迭代,将从左到右的运算应用于连续元素,并将结果累加到左操作数中。为了确定所讨论的方面,它有助于创建上述代码的变体
在下面的例子中,我们得到元素的和;我们发现,没有隐式1
作为工作中的“默认”值:
>>> print(reduce(lambda x, y: x + y, [2,3]))
5
如果iterable中没有剩余元素,则还原停止:
>>> print(reduce(lambda x, y: x + y, [1]))
1
如果没有任何元素,则还原将失败:
>>> print(reduce(lambda x, y: x + y, []))
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
print(reduce(lambda x, y: x + y, []))
TypeError: reduce() of empty sequence with no initial value
因此,x
确实是累加器,在输入iterable之前,它使用可选的初始值设定项
值进行初始化。而y
是iterable中的下一个值,如果没有元素(左),则忽略函数
下面是另一个更好地理解x
和y
角色的示例:
>>> print(reduce(lambda x, y: x - y, [1,2,3], 10))
4
在单步模式下,上述减少如下所示:
x=10#初始值设定项
y=1#从iterable开始
x=x-y#x==9
y=2#从iterable开始
x=x-y#x=7
y=3#从iterable开始
x=x-y#x==4
4#结果
是否从functools
导入reduce
?OP使用的列表是[1,2,3,4,5]
。但正如你的回答所指出的,我关于初始值的假设是不正确的。然而,你切换到循环的想法可能是正确的。这似乎是通过将reduce
函数从内置函数移动到functools
间接给出的建议,有关更多信息,请参阅
>>> print(reduce(lambda x, y: x - y, [1,2,3], 10))
4