【问题标题】:Map function and input function parameters映射函数和输入函数参数
【发布时间】:2013-02-18 16:02:16
【问题描述】:

这是一个愚蠢的例子:

def add_x_to_input(x,k):
   return x + k

myList = [1,2,3,4]
myNewList = map(add_x_to_input???, myList)

当我将add_x_to_input的参数x作为输入函数提供给map时,如何指定它?

【问题讨论】:

标签: python map-function


【解决方案1】:

你可以使用functools.partial():

from functools import partial
map(partial(add_x_to_input, some_value_for_x), myList)

或者您可以使用lambda(匿名的内联函数):

map(lambda k: add_x_to_input(some_value_for_x, k), myList)

或者你可以定义一个显式的新函数:

def wrapping_function(k):
    return add_x_to_input(some_value_for_x, k)

map(wrapping_function, myList)

如果您追求绝对的速度,functools.partial() 方法可以轻松胜出;它是用 C 代码实现的,避免了额外的 Python 堆栈推送:

>>> import timeit
>>> L = range(10)
>>> def foo(a, b): pass
... 
>>> def p(b): return foo(1, b)
... 
>>> timeit.timeit('map(p, L)', 'from __main__ import foo, L; from functools import partial; p = partial(foo, 1)')
3.0008959770202637
>>> timeit.timeit('map(p, L)', 'from __main__ import foo, L; p = lambda b: foo(1, b)')
3.8707590103149414
>>> timeit.timeit('map(p, L)', 'from __main__ import foo, L, p')
3.9136409759521484

【讨论】:

  • 我喜欢 lambda 函数解决方案。与直接拨打 map 相比,我是否应该担心对速度的任何可能影响?
  • @RickyRobinson:有一些间接性,所以所有三个选项都会花费你一些速度。不过,这三者的开销几乎相同。
  • 好的。问题是我正在尝试将所有 for 循环转换为 map 调用,所以我不想在速度方面回到以前的情况。
  • @RickyRobinson:我会尝试不同的方法,可能partial() 会更快(它在 C 中实现),例如,节省堆栈推送。
  • @RickyRobinson:我添加了一个速度比较供您欣赏; functools.partial() 将最接近直接调用包装函数。
【解决方案2】:
def add_x_to_input(x,k):
   return x + k

myList = [1,2,3,4]
x = 5
myNewList = map(lambda k:add_x_to_input(x,k), myList)

或者只是:

myNewList = [x+k for k in myList]

【讨论】:

    【解决方案3】:

    定义一个闭包:

    In [61]: def add_x_to_input(x,k):
        ...:    return x + k
    
    In [62]: def add_1(x):
        ...:     return add_x_to_input(x,1)
    
    In [63]: add_1(1)
    Out[63]: 2
    
    In [64]: list = [1,2,3]
    
    In [65]: map(add_1, list)
    Out[65]: [2, 3, 4]
    

    【讨论】:

    • 好的,我想避免必须为使用中的每个参数编写一个函数,但是如果没有其他方法,那就好。 :)
    猜你喜欢
    • 2022-12-17
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2021-11-20
    相关资源
    最近更新 更多