5

だから私は一種のPythonクラスで次のコードを与えてきました。それは実際には離散数学クラスですが、彼はPythonを使用してすべてを示しています。このコードは、マルチプレクサーを示し、それを使用してxorゲートを構築することを目的としています。

def mux41(i0,i1,i2,i3):
    return lambda s1,s0:{(0,0):i0,(0,1):i1,(1,0):i2,(1,1):i3}[(s1,s0)]

def xor2(a,b):
    return mux41(0,1,1,0)(a,b)

関数では、1と0のxor2背後にある構文がmux関数への入力であることがわかりreturn mux41(0,1,1,0)(a,b)ませんが、(a、b)は何をしていますか?

4

2 に答える 2

12

これ(a, b)は、実際には、lambda関数で返す関数への入力mux41です。

mux41関数は、lambda関数への入力に基づいてディクショナリの値を返すように見える関数を返しmux41ます。返す値を指定するには、2番目の入力が必要です。

これは、次と直接同等です。

def xor2(a,b):
    f = mux41(0,1,1,0)
    return f(a,b)
于 2013-02-01T23:46:10.453 に答える
5

これはPythonの初心者に投げかけるにはかなり高度なコードなので、気にしないでください。また、必要以上にトリッキーだと思います。

def mux41(i0,i1,i2,i3):
    return lambda s1,s0:{(0,0):i0,(0,1):i1,(1,0):i2,(1,1):i3}[(s1,s0)]

これは、2つの入力に基づいて値を返す関数オブジェクトを定義します。s12つの入力はとですs0。関数オブジェクトは、intに渡された4つの値が事前に入力されたディクショナリを構築し、それらの4つの値の1つをmux41()使用s0s1て選択します。

辞書はキーを使用して値を検索します。この場合、キーはPythonタプル:、、、、(0, 0)およびです。式は、引数と。からタプルを構築しています。このタプルは、ディクショナリから値を検索するためのキーとして使用されます。(0, 1)(1, 0)(1,1)(s1,s0)s0s1

def xor2(a,b):
    return mux41(0,1,1,0)(a,b)

したがって、mux41()先ほど説明したことを実行する関数オブジェクトを返します。 関数オブジェクトをxor2()呼び出して取得します。mux41()次に、返された関数オブジェクトをすぐに呼び出し、引数として渡しaますb。最後に答えを返します。

によって作成された関数オブジェクトmux41()はどこにも保存されません。したがって、を呼び出すたびにxor2()、関数オブジェクトを作成し、それをガベージコレクションします。関数オブジェクトを実行すると、ディクショナリオブジェクトが作成されます。これも、使用するたびにガベージコレクションされます。これはおそらく私が今まで見た中で最も複雑なXOR関数です。

これを少し明確にするかもしれない書き直しがあります。lambda名前のない関数オブジェクトを作成するために使用する代わりにdef、名前の付いた関数を作成するために使用します。

def mux41(i0,i1,i2,i3):
    def mux_fn(s1, s0):
        d = {
            (0,0):i0,
            (0,1):i1,
            (1,0):i2,
            (1,1):i3
        }
        tup = (s1, s0)
        return d[tup]
    return mux_fn

def xor2(a,b):
    mux_fn = mux41(0,1,1,0)
    return mux_fn(a,b)

編集:PythonでテーブルルックアップXORを作成したい場合は、次のように記述します。

_d_xor2 = {
    (0,0) : 0,
    (0,1) : 1,
    (1,0) : 1,
    (1,1) : 0
}

def xor2(a,b):
    tup = (a, b)
    return _d_xor2[tup]

ルックアップ辞書を一度作成してから、から直接使用しxor2()ます。で明示的な一時変数を作成する必要はxor2()ありませんが、少し明確になる可能性があります。あなたはこれを行うことができます:

def xor2(a,b):
    return _d_xor2[(a, b)]

どっちがいい?

もちろん、PythonにはXOR演算子が組み込まれているため、次のように記述できます。

def xor2(a,b):
    return a ^ b

これを実際に書いているとしたら、おそらくエラー処理を追加したり、bool値を操作するようにしたりします。

def xor2(a,b):
    return bool(a) ^ bool(b)

編集:もう1つ私に起こったことがあります。Pythonでは、ルールは「コンマがタプルを作成する」です。タプルを囲む括弧はオプションの場合があります。チェックしたところ、辞書ルックアップで括弧を省略しても問題なく機能します。だからあなたはこれを行うことができます:

def xor2(a,b):
    return _d_xor2[a, b]

そしてそれはうまくいきます。これはおそらく少しトリッキーすぎますか?これを他の誰かのコードで見た場合、それは私を驚かせるでしょう。

于 2013-02-01T23:55:27.657 に答える