如何使用lambda实现计数器?

2022-04-03 00:00:00 python counter lambda if-statement

问题描述

我是否可以使用python中的lambda函数或更具Python语风格的表达式来实现计数器?

以下是我的代码:

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+=1pass都是语句,但lambda是表达式,不能将语句放在表达式中。

但那很好。

lambdadef都是以相同的方式创建函数,但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成为全局。

相关文章