Python lambda 函数中是否可以有非局部?

问题描述 投票:0回答:1

现在我的 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 中定义非局部变量?

python lambda closures
1个回答
0
投票

一般来说,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
    

© www.soinside.com 2019 - 2024. All rights reserved.