Python:如何使用set参数创建函数指针?

Python:如何使用set参数创建函数指针?,python,global-variables,function-pointers,Python,Global Variables,Function Pointers,我的问题是: 鉴于以下情况: def foo(a,b) L2 = map(lambda arg: f(arg) + arg, L1) L2 = map(lambda (x,y): x + y, L1) L2 = map(lambda <arg>: <expression>, L1) 我试图调用python的“map”函数,同时为“a”传入一个列表,但为“b”使用一个设置值 另一个相关事实是“b”是用户输入,因此,我不能使用以下语法: def foo(a,b='defa

我的问题是:

鉴于以下情况:

def foo(a,b)
L2 = map(lambda arg: f(arg) + arg, L1)
L2 = map(lambda (x,y): x + y, L1)
L2 = map(lambda <arg>: <expression>, L1)
我试图调用python的“map”函数,同时为“a”传入一个列表,但为“b”使用一个设置值

另一个相关事实是“b”是用户输入,因此,我不能使用以下语法:

def foo(a,b='default value')
我希望我的“地图”呼叫如下所示:

map(foo_wrapper,list_for_a)
其中'foo_wrapper'是接受'a'但使用用户指定的'b'的函数

我不知道函数指针是否可以这样指定,我怀疑它们不能

我对这个问题的解决方法是使用globals,因此,如果有一种更优雅的方法,而上述方法是不可能的,我也会将其标记为答案

简而言之,以下是我的解决方案:

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)
上面可能有一两个打字错误;我正在简化我实际需要做的事情

谢谢你的回复

为此,您可以使用:

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]

你想要类似于咖喱的东西。您可以在此处使用lambda:

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

使用列表理解或生成器表达式

[f(x, your_set) for x in your_list]
如果结果不需要列表,而只需要一个惰性计算迭代器,那么可以使用生成器表达式(或者如果您指的是Python3的映射)

编辑:

对于您的功能,这将是:

L = ['John', 'Jacob', 'Jingle all the way']
[foo(a, b=b) for a in L]
列表理解是用
lambda
替换
map
的语法糖。如果您有以下情况之一:

def foo(a,b)
L2 = map(lambda arg: f(arg) + arg, L1)
L2 = map(lambda (x,y): x + y, L1)
L2 = map(lambda <arg>: <expression>, L1)
等效列表理解为:

','.join([x.upper() for x in L])
但实际上您不需要列表,因此您可以简单地执行以下操作:

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

函数“指针”?什么是“指针”?“过程”是正确的名称吗?如果是这样,我会更新它。我正在查找terminology.functools.partial,尝试替换第一个参数时失败。尝试部分(f,a=3)。lambda解决方案适用于所有替换:)@Foo-Bah:它适用于
partial(f,3)
,这是位置参数的正确解决方案;)@foobah:省略
a=
,它就会工作。“我还是喜欢。”德尔南,f(a,b,c)试着专门研究b怎么样<代码>functools.partial很酷,但没有lambda那么通用solution@Foo巴哈;是的,如果您需要这种花式的东西,您需要自己滚动一些东西(lambda或双线
def
)。也许你能再解释一下你的答案吗?它概括得很好:)
','.join(x.upper() for x in L)