一个函数的2个输入?

2024-06-08 16:59:37 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我在一种类似python类中给出了以下代码。这确实是一个离散的数学类,但他使用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)]

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

xor2函数中,我不理解return mux41(0,1,1,0)(a,b)后面的语法,1和0是mux函数的输入,但是(a,b)在做什么呢?在


Tags: lambda函数代码returndef语法数学i3
2条回答

(a, b)实际上是您在mux41函数中返回的lambda函数的输入。在

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

它直接相当于:

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

对于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)]

它定义了一个基于两个输入返回值的函数对象。这两个输入是s1s0。function对象构建一个字典,其中预填充了传递给mux41()的四个值,它使用s0和{}来选择这四个值中的一个。在

字典使用键来查找值。在本例中,键是Python元组:(0, 0)(0, 1)(1, 0),和{}。表达式(s1,s0)正在从参数s0s1构建元组。这个元组用作从字典中查找值的键。在

^{pr2}$

因此,mux41()返回一个函数对象,它执行我刚刚讨论过的内容。xor2()调用mux41()并获得一个函数对象;然后它立即调用返回的函数对象,并将a和{}作为参数传入。最后它返回答案。在

mux41()创建的函数对象不会保存在任何地方。因此,每次调用xor2(),都是在创建一个函数对象,然后被垃圾回收。当function对象运行时,它将构建一个dictionary对象,并且在每次使用之后都会被垃圾回收。这可能是我见过的最复杂的异或函数。在

这里有一个重写,可能会使这一点更清楚。我不使用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()中生成显式的temp变量,但可能会更清楚一些。你可以这样做:

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)

编辑:我又发生了一件事。在Python中,规则是“逗号生成元组”。元组周围的括号有时是可选的。我刚检查过,在查字典的时候去掉括号就行了。所以你可以这样做:

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

而且效果很好。这也许有点太棘手了?如果我在别人的代码中看到这一点,我会感到惊讶的。在

相关问题 更多 >