如何使用lambda实现计数器?
问题描述
我是否可以使用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+=1
和pass
都是语句,但lambda
是表达式,不能将语句放在表达式中。
但那很好。
lambda
和def
都是以相同的方式创建函数,但lambda
更有限。
如果需要在表达式中间创建函数,则必须使用lambda
,但这里不是这样,因为创建它只是为了在赋值语句中使用。
如果函数没有好的名称,您可能希望使用lambda
,但这里也不是这样,因为您会立即为其命名。
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
成为全局。
相关文章