Python:如何创建带有固定参数的函数指针?
我的问题是:
给定以下内容:
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]
列表推导式是一种语法糖,用来替代使用map
和lambda
的情况。如果你有以下的情况:
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]