Skip to main content
 首页 » 编程设计

python之如何使用 lambda 实现计数器

2025年05月04日11lhb25

我可以在 python 中使用 lambda 函数或一些更 pythonic 的表达式来实现计数器吗?

这是我的代码:

counter = 0      
if 0 < arrival_time: 
   counter += 1 
else: 
   pass 

这是我尝试过的:

count_late = lambda x, arrival_time: x+=1 if 0 < arrival_time else pass 
counter_late(counter, arrival_time) 

错误:

我缺少什么或如何改进此代码?

请您参考如下方法:

两者都是 x+=1和 pass是语句,但是 lambda是一个表达式,不能将语句放在表达式中。

不过没关系。

lambda和 def两者都以相同的方式创建一个函数,但是 lambda更有限。

如果你需要在表达式中间创建一个函数,你必须使用lambda — 但这里不是这种情况,因为您创建它只是为了在赋值语句中使用。

如果函数没有好的名称,您可能需要使用 lambda ,但这里也不是这种情况,因为您会立即给它命名。

有些人(主要是那些花太多时间使用 Lisp 或 ML 系列函数式语言的人)也喜欢使用 lambda明确表示他们正在编写一个“纯函数”,该函数没有副作用并返回一个仅取决于其参数值的值。但这里也不是这种情况。 (如果将其更改为 lambda x, arrival_time: x+1 if 0 < arrival_time else x ,那将是纯函数的一个很好的示例。然后您可以使用例如 x = count_late(x) 来调用它。)

所以,绝对没有理由使用 lambda首先在这里。只需使用 def :

def count_late(x, arrival_time): 
    if 0 < arrival_time: 
        x += 1 

然而,值得注意的是,虽然这是现在有效的语法,但它不会有任何好处。

数字是不可变的;无法更改号码 2入号3 ,因为那会破坏所有物理学。当你写 x += 1 , 这只是使局部变量 x为号码取个名字 3而不是数字的名称 2 .如果你用 count_late(spam, 5) 调用它它不会改变什么 spam意思是,就像你用 count_late(2*3, 5) 调用它一样它不会改变什么 2*3意味着。

所以,您可能想要:

  • 将其设为 return 的纯函数是一个值(如上所述,这意味着您可以使用 lambda ,有些人会对此感到满意,但我仍然肯定更喜欢这里的 def),或者
  • 使它成为某个具有self.x 的对象的方法, 或
  • 制作x一个全局性的。