ラムダ関数のリストを操作したいのですが。このラムダ関数のリストにはすべて同じ関数が含まれているので、その関数に追加の引数が含まれるように操作したいと思います。
私の例については、以下を参照してください
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')
]
関数のリスト全体を書き直すことなく、この関数のリストを次のように変更することは可能ですか?
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')
]
私がやろうとしていることの別の例については、以下を参照してください。私は以下を持っています:
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)]
しかし、上記のlist_of_functionsまたはsimple_functionを書き直すことなく、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)]
@ 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
]
引数を最後に配置するには、@ 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)
]
あなたはそのようにアプリケーションを行うことができます:
desired_list_of_functions = [
partial(fn, capitalize=True) for fn in list_of_functions
]
これは、関数に適用さ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')
上記のハックは、ラムダ関数のコンテンツが実行時に実行されていないため、のlambda
定義list_of_functions
がまだsimple_function
参照にバインドされていないという事実を利用しています。
参照はラムダが呼び出されているときにのみ評価されるためsimple_function
、ラムダ内の参照は、元の関数インスタンスではなく、新しい部分インスタンスを指します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加