【问题标题】:How to implement a counter using a lambda?如何使用 lambda 实现计数器?
【发布时间】:2018-07-03 00:04:03
【问题描述】:

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

错误:

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

【问题讨论】:

  • 最后一件事:当人们谈论“使用函数的计数器”时,他们通常是 Lisp 类型的人,他们在寻找类似 @​​987654322@ 的东西。但是,如果这就是您的目标,请查看其正下方的第二个版本以获得更 Pythonic 的解决方案。 (实例和闭包是双重的,但这并不意味着没有理由更喜欢其中之一——它几乎总是以一种或另一种方式更具可读性。)
  • 我建议对您的代码进行一个小的改进:您不需要为每个 if 语句添加一个 else 语句。删除 else: pass 不会影响代码的运行方式。它可以节省空间,在某些情况下还可以让您头疼。
  • @abarnert 在我处理计数器时使用类更好吗?或者只是启动一个变量计数器和循环?感谢代码
  • @may 这完全取决于你在做什么。如果你想要一个封装一些状态并提供不透明方法来更新它的计数器,就像我在上面链接中给出的示例一样,那么你需要一个类。如果您只想继续添加到 int,那么您可能想要一个返回新值的纯函数,或者一个更新全局变量的函数;无论哪种方式都不需要上课。没有看到你的设计的其余部分,很难说你想要哪一个。
  • 你有什么特别的理由想用lambda来做吗?

标签: python if-statement lambda counter


【解决方案1】:

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

不过没关系。

lambdadef 都只是创建一个函数,方法相同,但lambda 更有限。

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

如果一个函数没有好名字,你可能想使用lambda,但这里也不是这样,因为你马上给它一个名字。

有些人(主要是那些花太多时间使用 Lisp 或 ML 家族函数式语言的人)也喜欢使用 lambda 来明确表示他们正在编写一个“纯函数”,一个没有副作用,并返回一个仅取决于其参数值的值。但这里也不是这样。 (如果您将其更改为 lambda x, arrival_time: x+1 if 0 &lt; 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 的含义。

所以,你可能想:

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

【讨论】:

  • 感谢您的解释,因为我是 python 的新手,我发现使用 python 的功能用更少的代码改进代码是很困难的。相信您的解释对我有参考意义,非常感谢您的回答。
【解决方案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 是您想要的变量到达时间的值。

如果你得到一个语法错误。

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

例如)

counter = (lambda 到达时间: counter+1 if 0

【讨论】:

  • 这也是一种查看 lambda 函数的有趣方式。另一个答案更一致,但我感谢您与我分享这些知识
  • PASS 应该在这里是什么?正如所写,它只是将SyntaxError 变成NameError。我能想到的唯一真正有意义的值是counter,但只是执行PASS = counter 不会有任何帮助,因为在您第一次执行counter = … 之后,会将counter 更新为新值但将PASS 保留为旧版本。
  • 你是对的。我想念它并进行了修改。 PASS 用于提问者的需要。
猜你喜欢
  • 2014-06-21
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多