如何解决lambda 函数如何与 Python 中的 reduce 函数配合使用?
我正在尝试运行以下代码:
print(reduce(lambda x,y: x + y,[1,2,3,4,5]))
O/P -> 15
什么是x
和y
?这里的累加器是哪个?累加器是否总是必须是第一个参数(即 x
此处)
没有初始化时会发生什么?选择的默认值是多少?
解决方法
我认为 functools.reduce(function,iterable[,initializer]) 的文档可读性很强。执行迭代,将操作从左到右应用于连续元素,并将结果累加到左操作数中。为确定相关方面,创建上述代码的变体会有所帮助。
在下面的例子中,我们得到元素的总和;我们看到在工作中没有隐含的 1
作为“默认”值:
>>> print(reduce(lambda x,y: x + y,[2,3]))
5
如果迭代中没有元素,则减少停止:
>>> print(reduce(lambda x,[1]))
1
如果根本没有元素,则减少失败:
>>> print(reduce(lambda x,[]))
Traceback (most recent call last):
File "<pyshell#11>",line 1,in <module>
print(reduce(lambda x,[]))
TypeError: reduce() of empty sequence with no initial value
可选的 initializer
值用于开始缩减(如果没有元素则立即停止):
>>> print(reduce(lambda x,[],0))
0
所以 x
确实是在进入迭代之前用可选的 initializer
值初始化的累加器。 y
是可迭代对象的下一个值,如果没有元素(左),则忽略 function
。
这是另一个可以更好地理解 x
和 y
角色的示例:
>>> print(reduce(lambda x,y: x - y,[1,2,3],10))
4
在单步模式下,上面的减少看起来像这样:
x = 10 # initializer
y = 1 # from iterable
x = x-y # x==9
y = 2 # from iterable
x = x-y # x==7
y = 3 # from iterable
x = x-y # x==4
4 # result
,
此代码的扩展形式,可能更容易理解
lst = [1,3,4,5]
x = 0 # Default value
for i in lst:
y = i
x = x + y
print(x)
或者,如果您考虑 lambda 函数:
lst = [1,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,因为这是默认值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。