将函数列表应用于一个参数

时间:2018-03-20 14:52:48

标签: python

假设我们有一个功能列表

funcs = [int, float]

我们希望将它们应用于一个参数0以获取[0, 0.0]

显然我们可以(编辑:应该!)做

[f(0) for f in funcs]

但标准库中是否还有其他任何机制,类似于map函数?

2 个答案:

答案 0 :(得分:2)

这里的列表理解是首选方法。但是,如果您想避免列表理解,可以使用map()

map(lambda f: f(0), funcs)
#[0, 0.0]

但是在python3中你需要用map()来调用list,因为map()返回一个迭代器:

list(map(lambda f: f(0), funcs))

但是作为@jonrsharpe mentioned in the comments,不推荐这样做wastefully creates a list

时间安排结果

在运行python 2.7的计算机上

#List comprehension
%%timeit
[f(0) for f in funcs]
#1000000 loops, best of 3: 352 ns per loop

#map + lambda
%%timeit
map(lambda f: f(0), funcs)
#1000000 loops, best of 3: 687 ns per loop

#generator
list(f(0) for f in funcs)
#1000000 loops, best of 3: 1.1 µs per loop

#map + methodcaller
%%timeit
map(methodcaller('__call__', 0), funcs)
#1000000 loops, best of 3: 687 ns per loop
  • 最慢的解决方案(到目前为止)是@ comments中@timgeb建议的生成方法。
  • 列表理解是最快的
  • 使用map()的两种解决方案都是第二快的。

答案 1 :(得分:2)

>>> from operator import methodcaller
>>> funcs = [int, float]
>>> map(methodcaller('__call__', 0), funcs)
[0, 0.0]

毫无意义但可能。