2个功能输入?

Dee*_*kor 5 python python-2.7

所以我一直在一种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)
Run Code Online (Sandbox Code Playgroud)

xor2函数中我不明白return mux41(0,1,1,0)(a,b)1和0 背后的语法是多路复用函数的输入,但是(a,b)做什么?

Vol*_*ity 12

(a, b)实际上是输入lambda您在返回函数mux41功能.

您的mux41函数返回一个lambda函数,它看起来像是根据mux41函数的输入在字典中返回一个值.您需要第二个输入来说明要返回的值.

它直接相当于:

def xor2(a,b):
    f = mux41(0,1,1,0)
    return f(a,b)
Run Code Online (Sandbox Code Playgroud)

  • +1,我希望你不介意,添加一个我认为澄清一点的例子. (3认同)

ste*_*eha 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)]
Run Code Online (Sandbox Code Playgroud)

这定义了一个函数对象,它根据两个输入返回一个值.这两个输入是s1s0.函数对象构建一个字典,该字典预先填充了传递给int的四个值mux41(),并使用s0s1选择这四个值中的一个.

字典使用键来查找值.在这种情况下,关键是Python的元组:(0, 0),(0, 1),(1, 0),和(1,1).表达式(s1,s0)是从参数s0和构建元组s1.此元组用作从字典中查找值的键.

def xor2(a,b):
    return mux41(0,1,1,0)(a,b)
Run Code Online (Sandbox Code Playgroud)

所以,mux41()返回一个函数对象来完成我刚刚讨论过的东西. xor2()调用mux41() 并获取一个函数对象; 然后它立即调用返回的函数对象,传入ab作为参数.最后它返回答案.

创建的函数对象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)
Run Code Online (Sandbox Code Playgroud)

编辑:如果我想在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]
Run Code Online (Sandbox Code Playgroud)

我们构建一次查找字典,然后直接使用它xor2().没有必要制作一个明确的临时变量,xor2()但它可能会更清楚一点.你可以这样做:

def xor2(a,b):
    return _d_xor2[(a, b)]
Run Code Online (Sandbox Code Playgroud)

你喜欢哪个?

当然,由于Python内置了一个XOR运算符,你可以像这样写:

def xor2(a,b):
    return a ^ b
Run Code Online (Sandbox Code Playgroud)

如果我是真的写这个,我可能会添加错误处理和/或使其对bool值进行操作.

def xor2(a,b):
    return bool(a) ^ bool(b)
Run Code Online (Sandbox Code Playgroud)

编辑:还有一件事发生在我身上.在Python中,规则是"逗号制作元组".元组周围的括号有时是可选的.我刚检查过,它可以正常工作,在字典查找中省略括号.所以你可以这样做:

def xor2(a,b):
    return _d_xor2[a, b]
Run Code Online (Sandbox Code Playgroud)

它工作正常.这可能有点太棘手了?如果我在别人的代码中看到这个,那会让我感到惊讶.

  • "这可能是我见过的最复杂的XOR功能." - 你并不是唯一的一个. (4认同)