Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在python中,lambda函数如何与reduce函数一起工作?_Python 3.x_Lambda_Reduce - Fatal编程技术网

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