【问题标题】:Python lambda function declaration and call for list generationPython lambda 函数声明和调用列表生成
【发布时间】:2015-01-09 20:25:23
【问题描述】:

在生成如下列表时,lambda 函数在方括号外声明,然后应用于每个i

>>> g = lambda x: x*10
>>> [g(i) for i in range(10,21)]
[100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]

是否可以(以及如何)在列表中声明 lambda 函数并调用它?

【问题讨论】:

  • 第一个猜测:[(lambda x: x*10)(i) for i in range(10,21)]。你为什么觉得你想这样做?
  • 你最终会产生缓慢且不可读的代码
  • @enzyme 请注意,短代码并不总是意味着 Python 中的高效代码。
  • 你永远不会想要这样做。 lambda 只是一个单行函数,您可以轻松地将其主体放入列表推导式中。
  • 将 lambda 赋值给一个变量很少是正确的,但是一堆可怕的 lambda 教程还是这样做了。

标签: python list python-3.x lambda


【解决方案1】:

疯狂的方式:

[(lambda x: x*10)(i) for i in range(10,21)]

理智的方式:

[i * 10 for i in range(10,21)]

【讨论】:

  • 解释:在推导式中声明 lambda 函数的问题在于,该函数会为列表中的每一项重复创建。由于 lambda 的主体是单个表达式,因此最好将该表达式直接放入推导式中。
【解决方案2】:

你也可以使用地图:

>>> list(map(lambda x:x*10,range(10,21)))
[100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]

【讨论】:

  • 很好的答案,除了 map 返回一个列表,因此不需要转换。
  • 哎呀,应该考虑到这一点。该评论适用于 python 2。
  • Grt 你自己意识到了 :)
  • @tdelaney Python 2 版本:map(lambda x:x*10, xrange(10,21)).
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2016-04-10
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多