映射函数和输入函数参数

0 投票
3 回答
528 浏览
提问于 2025-04-17 16: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 呢?

3 个回答

1

定义一个闭包:

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]
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]
6

你可以使用 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

撰写回答