如何使用Lambda实现计数器?

时间:2018-07-03 00:04:03

标签: python if-statement lambda counter

我可以在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)

错误: enter image description here

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

2 个答案:

答案 0 :(得分:6)

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设为全局。

答案 1 :(得分:2)

如果您有一个功能counter_late():

**
#the 'counter' is in counter_late() or  global
counter_late((lambda arrival_time: counter+1 if 0 < arrival_time else PASS), 10)

**

其他:

**
counter = 0 #global variable

counter = (lambda arrival_time: counter+1 if 0 < arrival_time else PASS)(10)

#check the value of counter 
print('conter=',counter)
**

10是您想要的变量,其值为arrival_time。

如果语法错误。

PASS是更改其他值,您想要一个数字或条件。

例如)

counter =(λ到达时间:如果0 <到达时间,则为+1,否则为1)(0)