获取作为变量传入的函数的返回值

时间:2015-10-18 00:27:44

标签: python python-3.x logic

我目前正在尝试编写一个函数,该函数将两个真值函数作为其参数,并根据它们是否在逻辑上等效返回一个布尔值。例如,假设主要功能是

def logical_equiv(function1, function2):
    #function1 and function2 are truth functions

通过执行

检查传入的两个函数是否相同
def logical_equiv(function1, function2):
    if function1 == function2:
         return True

但是如何检查function1和function2的实际返回值?为了更清楚,让我们说function1取两个参数P和Q,然后返回(不是P)或(不是Q)而function2也取两个参数P和Q然后返回不(P和Q),我怎么检查在我的logical_equiv函数?我试着做了

def logical_equiv(function1, function2):
     if function1 == (not P) or (not Q):
          #do something

但这会返回错误NameError: name 'P' is not defined 从logical_equiv打印出该函数会返回一个内存地址。

2 个答案:

答案 0 :(得分:2)

如果你想使用相同的参数来查看它们在逻辑上是否相同:

def logical_equiv(function1, function2, *args):
    return function1(*args) == function2(*args)

然后:

>>> func1 = lambda P, Q: (not P) or (not Q)
>>> func2 = lambda P, Q: not(P and Q)
>>> logical_equiv(func1, func2, True, False)
True

这可以扩展到任意数量的论点:

>>> func1 = lambda P, Q, R: (not P) or (not Q) or (not R)
>>> func2 = lambda P, Q, R: not(P and Q and R)
>>> logical_equiv(func1, func2, True, False, True)
True

如果您需要为[True, False]参数测试n的所有有效组合,那么您可以执行以下操作:

from itertools import product
def logical_equiv(f1, f2):
    n = f1.__code__.co_argcount        # @dopstart
    if n != f2.__code__.co_argcount:
        return False
    return all(f1(*args) == f2(*args) for args in product([True, False], repeat=n))

>>> func1 = lambda P, Q, R: (not P) or (not Q) or (not R)
>>> func2 = lambda P, Q, R: not(P and Q and R)
>>> logical_equiv(func1, func2)
True

答案 1 :(得分:0)

我想你会这样做:

def logical_equiv(function1, function2):
     if function1() in [(not P), (not Q)]:
          #do something

当然,您需要定义PQ。请记住,function1只是对函数的引用,而function1()调用函数,返回其值。

此外,要检查function1function2的输出是否相同,只需执行以下操作:

if function1() == function2():
    ...