如何使用python操作lambda中的函数?

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)

zmo*_*zmo 0

以下是我使用部分应用程序的方法,如 @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 中的引用将指向新的部分实例而不是原始函数实例。