Chr*_*ris 6 python lambda function
我想操作一个lambda函数列表.这个lambda函数列表都包含相同的函数,我想操作它,以便其中的函数有一个额外的参数
请参阅下面的示例
def base_function(*args):
for arg in args:
print arg
list_of_functions = [
lambda new_arg: base_function(new_arg,'arg_1'),
lambda new_arg: base_function(new_arg,'arg_2'),
lambda new_arg: base_function(new_arg,'arg_3')
]
Run Code Online (Sandbox Code Playgroud)
是否可以将此功能列表更改为以下内容,而无需重新编写整个功能列表
list_of_functions = [
lambda new_arg: base_function(new_arg,'arg_1','another_arg'),
lambda new_arg: base_function(new_arg,'arg_2','another_arg'),
lambda new_arg: base_function(new_arg,'arg_3','another_arg')
]
Run Code Online (Sandbox Code Playgroud)
请参阅下文,了解我正在尝试做的另一个例子.我有以下内容:
def simple_function(arg,capitalize=False):
if capitalize:
print arg.upper()
else:
print arg
list_of_functions = [lambda key_word: simple_function(key_word),lambda key_word: simple_function(key_word)]
Run Code Online (Sandbox Code Playgroud)
但我想将list_of_functions更改为以下内容,而无需重写上面的list_of_functions或simple_function:
desired_list_of_functions = [lambda key_word: simple_function(key_word,capitalize=True),lambda key_word: simple_function(key_word,capitalize=True)]
Run Code Online (Sandbox Code Playgroud)
以下是我使用部分应用程序的方法,如 @austin-hastings 所建议:
# first example from the OP
def base_function(*args):
for arg in args:
print arg
list_of_functions = [
lambda new_arg: base_function(new_arg,'arg_1'),
lambda new_arg: base_function(new_arg,'arg_2'),
lambda new_arg: base_function(new_arg,'arg_3')
]
# solution:
from functools import partial
new_list_of_functions = [
partial(fn, 'another_arg') for fn in list_of_functions
]
Run Code Online (Sandbox Code Playgroud)
要将参数放在最后,您可以查看@austin-hastings 的解决方案。
当然,您可以使用部分应用程序来隐藏 list_of_functions 。
然后,对于您给定的用例:
desired_list_of_functions = [
lambda key_word: simple_function(key_word,capitalize=True),
lambda key_word: simple_function(key_word,capitalize=True)
]
Run Code Online (Sandbox Code Playgroud)
你可以这样申请:
desired_list_of_functions = [
partial(fn, capitalize=True) for fn in list_of_functions
]
Run Code Online (Sandbox Code Playgroud)
那是因为partial将其作为参数(fn, *args, **kwargs)应用于该函数。
好的,可以通过使用引用阴影来解决您的问题,如下所示:
def simple_function(arg,capitalize=False):
if capitalize:
print (arg.upper())
else:
print (arg)
list_of_functions = [lambda key_word: simple_function(key_word),lambda key_word: simple_function(key_word)]
# will print 'foo' twice
for fn in list_of_functions:
fn('foo')
simple_function = partial(simple_function, capitalize=True)
# will print 'FOO' twice
for fn in list_of_functions:
fn('foo')
Run Code Online (Sandbox Code Playgroud)
上述 hack 利用了以下事实:lambda中 的定义list_of_functions尚未绑定到simple_function引用,因为 lambda 函数的内容尚未在运行时执行。
仅当调用 lambda 时才会对引用进行赋值,因此simple_functionlambda 中的引用将指向新的部分实例而不是原始函数实例。