我可以在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)
我缺少什么或如何改进此代码?
答案 0 :(得分:6)
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
设为全局。答案 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)