【问题标题】:Interpreting a list of lambdas解释 lambda 列表
【发布时间】:2013-05-30 10:48:41
【问题描述】:

我也有一个包含一些 lambda 元素的列表:

l=['A',lambda x:x*2,lambda x:x*3]

执行 lambda 后如何将此列表附加到另一个列表(如下所示 - 显然这个不起作用):

m=list(k=k(3) if isinstance(k,types.FunctionType) else k for k in l)

预期结果是:

m=['A',6,9]

这可能吗?

【问题讨论】:

  • 你为什么要这样做?

标签: python lambda callable


【解决方案1】:

您可以使用callable

>>> l = ['A', lambda x:x*2, lambda x:x*3]
>>> m = [k(3) if callable(k) else k for k in l]
>>> m
['A', 6, 9]

【讨论】:

  • 应该记住,类的可调用对象也是如此isinstance(a, type) and callable(a) == True
【解决方案2】:

您确定要将此列表附加到另一个列表,还是创建一个新列表? 以防万一您碰巧使用了不推荐使用可调用的python版本:

for element in l:
    m.append(element(3) if hasattr(element, '__call__') else element)

【讨论】:

  • 使用callable 而不是hasattr(element, '__call__')
  • @oleg 主要问题是在不使用结果时使用三元 if
  • 如果你使用 Python3.0 或 3.1,你应该使用isinstance(element, collections.Callable) 而不是callable()。在 3.2+ 中,callable() 复活了。
  • @jamylak 你的意思是等效的行应该是这样的:m.append(element(3) if hasattr(element, '__call__') else element) 吗? (忽略可调用问题)谢谢
  • @andy 更好,它实际上使用了三元 if,就像它应该的那样。
猜你喜欢
  • 2018-04-18
  • 2018-09-11
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2015-07-14
相关资源
最近更新 更多