16

Python で、fいくつかの 2 次引数を使用して渡したい関数があるとします (簡単にするために、最初の引数だけが変数のままであると仮定します)。

これら2つの方法の違いは何ですか(もしあれば)?

# Assume secondary_args and secondary_kwargs have been defined

import functools

g1 = functools.partial(f, *secondary_args, **secondary_kwargs)
g2 = lambda x: f(x, *secondary_args, **secondary_kwargs)

たとえば、のドキュメント ページにpartialは、次の引用があります。

partialクラスで定義されたオブジェクトは静的メソッドのように動作し、インスタンス属性のルックアップ中にバインドされたメソッドに変換されません。

クラスに提供された引数からクラスメソッドを作成するために使用された場合、ラムダメソッドはこれに悩まされますか(コンストラクターまたは後で関数を介して)?

4

5 に答える 5

14
  1. ラムダ関数は標準関数と同じ型を持つため、インスタンス メソッドのように動作します。

  2. あなたの例のpartialオブジェクトは、次のように呼び出すことができます。

    g1(x, y, z)
    

    この呼び出しにつながります(有効なPython構文ではありませんが、アイデアは得られます):

    f(*secondary_args, x, y, z, **secondary_kwargs)
    

    ラムダは単一の引数のみを受け入れ、異なる引数の順序を使用します。(もちろん、これらの違いは両方とも克服できます。私は、あなたが提供した 2 つのバージョンの違いが何であるかを答えているだけです。)

  3. オブジェクトの実行は、同等のpartialオブジェクトの実行よりわずかに高速ですlambda

于 2012-08-06T12:41:06.237 に答える
0

クラスメソッドのことは、クラス定義中に割り当てられた関数にのみ適用されると思います。後で割り当てられた機能は特別に扱われません。

それ以外では、個人的にはラムダの方が一般的であり、コードが理解しやすくなるため、ラムダを好みます。

class Foo(object):
    def __init__(self, base):
        self.int = lambda x:int(x, base)

print Foo(4).int('11')
于 2012-08-06T12:40:26.297 に答える
0

はい、lambdaこれから「苦しむ」でしょう。partial実際の関数ではなく、呼び出し演算子がオーバーロードされたオブジェクトであるため、この問題はありません。

しかし、クラス定義でこのようなラムダを使用するのは、単なる誤用です。

于 2012-08-06T12:40:35.250 に答える