Python:如何创建带有固定参数的函数指针?

3 投票
3 回答
5965 浏览
提问于 2025-04-16 12:05

我的问题是:

给定以下内容:

def foo(a,b)

我想在调用Python的'map'函数时,传入一个列表作为'a',但想给'b'使用一个固定的值。

还有一个相关的事实是,'b'是用户输入的,所以我不能使用这样的语法:

def foo(a,b='default value')

我希望我的'map'调用看起来像这样:

map(foo_wrapper,list_for_a)

其中'foo_wrapper'是一个函数,它接收'a',但使用用户指定的'b'。

我不确定函数指针是否可以这样指定,怀疑是不可以的。

我解决这个问题的方法是使用全局变量,所以如果有更优雅的解决方案,而上述方法又不可行,我也会把那个作为答案。

这里是我解决方案的简要说明:

b = ''
def foo(a,b):
  print b,a

def foo_wrapper(a):
  foo(a,b)

def main():
  if sys.argv[1]:
    a = ['John', 'Jacob', 'Jingle all the way']
    global b
    b = sys.argv[1]
    map(foo_wrapper,a)

上面可能有一两个拼写错误;我在简化我实际需要做的问题。

谢谢大家的回复!

3 个回答

1

使用列表推导式或生成器表达式

[f(x, your_set) for x in your_list]

如果你不需要一个列表作为结果,而只是想要一个懒惰求值的迭代器,你可以使用生成器表达式(或者如果你指的是Python 3的map)。

(f(x, your_set) for x in your_list)

编辑:

对于你的函数来说,可以这样写:

L = ['John', 'Jacob', 'Jingle all the way']
[foo(a, b=b) for a in L]

列表推导式是一种语法糖,用来替代使用maplambda的情况。如果你有以下的情况:

L2 = map(lambda arg: f(arg) + arg, L1)
L2 = map(lambda (x,y): x + y, L1)
L2 = map(lambda <arg>: <expression>, L1)

它们可以被改写为列表推导式:

L2 = [f(arg) + arg for arg in L1]
L2 = [x + y for x, y in L1]
L2 = [<expression> for <arg> in L1]

生成器表达式类似于列表推导式,但它返回的是一个懒惰的迭代器,而不是一个列表,并且用圆括号而不是方括号来书写。(而且因为Python 3中的map不再返回列表,所以它的等价物是生成器表达式。)有时候你并不需要一个列表,比如当你想要做:

','.join(map(lambda x: x.upper(), L))

等价的列表推导式是:

','.join([x.upper() for x in L])

但实际上你并不需要一个列表,所以你可以简单地这样做:

','.join(x.upper() for x in L)
7

你想要的功能类似于“柯里化”。在这里你可以直接使用lambda表达式:

map(lambda x: f(x,3), a)
7

你可以使用 functools.partial() 来实现这个功能:

from functools import partial

def f(a, b):
    return a + b

x = range(10)
print map(partial(f, b=3), x)

输出结果是

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

撰写回答