1

基本的な関数があるとしましょう:

def basic(arg):
    print arg

この関数の評価を別の関数で延期する必要があります。私は2つの可能な方法について考えています:

  1. ラムダの使用:

    def another(arg):
        return lambda: basic(arg)
    
  2. functools.partial の使用

    from functools import partial
        def another(arg):
            return partial(basic, arg)
    

これらのアプローチのどれが好まれますか、またその理由は何ですか? これを行う別の方法はありますか?

4

2 に答える 2

5

ラムダは、引数にないデータを保存しません。これにより、奇妙な動作が発生する可能性があります。

def lambdas(*args):
    for arg in args:
        yield lambda: str(arg)

one, two, three, four = lambdas(1, 2, 3, 4)
print one(), two(), three(), four()

期待される出力

1 2 3 4

出力

4 4 4 4

これは、ラムダが値を格納せず、 のargすべての要素を通過したために発生するため、args現在argは常に4です。

推奨される方法はfunctools.partial、引数を格納する必要があるを使用することです。

from functools import partial

def partials(*args):
    for arg in args:
        yield partial(str, arg)

one, two, three, four = partials(1, 2, 3, 4)
print one(), two(), three(), four()

期待される出力

1 2 3 4

出力

1 2 3 4
于 2014-09-13T09:57:17.193 に答える
1

これは主に個人的な好みによるものだと思いますが、同等のものよりも多少速いfunctools.partial と考えられlambdaています。functools.partial私は、本格的なクロージャーではなく、単純な部分関数アプリケーションを扱っていることを示すのが理にかなっているような状況で使用することを好みます。

于 2014-09-13T09:57:20.007 に答える