现在我的 lambda 函数是:
In [40]: f=lambda x, count=0: count if not(x%3==0) else count+1
In [41]: [f(x) for x in range(10)]
Out[41]: [1, 0, 0, 1, 0, 0, 1, 0, 0, 1]
但我真正想要的是累积计数,这样输出将是:
Out[42]: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4]
我正在寻找一些代码,例如:
f=lambda x, count=0: nonlocal count if not(x%3==0) else count+1
但收到使用“nonlocal”的语法错误消息。所以我的问题是:有没有办法在 lambda 中定义非局部变量?
一般来说,lambda 函数应该是纯函数,这就是为什么它们有目的地限制为表达式。
因此,您不能在 lambda 表达式中分配给非局部/全局变量(尽管您可以使用赋值表达式来分配给局部变量)。
如果您想要使用
nonlocal
/global
并将分配给变量,您可以始终只使用函数定义语句。您永远不会“必须”使用 lambda 表达式来创建函数。并且 lambda 表达式的功能受到有意限制。如果您想要除此之外的东西,只需使用函数定义语句即可。
但在这种情况下,你不应该这样做在这种情况下,你试图使用列表理解来产生副作用。这通常令人困惑并被认为是一种反模式。最好简单地使用 for 循环:
result = []
count = 0
for i in range(10):
if i%3 == 0:
count += 1
result.append(count)
这完全是Pythonic。
但是如果您想要更实用的编程方法,您应该使用
itertools.accumulate
:
import itertools
result = itertools.accumulate(map(lambda x: int(x%3 == 0), range(10)))
Lambda 表达式不能包含
nonlocal
或
global
等语句。但你应该为工作选择正确的工具,在这种情况下,它要么只是一个普通的 for 循环,要么 itertools.accumualte
。