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

2024-04-25 13:28:54 发布

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

我目前正在尝试编写一个函数,它以两个真值函数作为参数,并根据它们在逻辑上是否等价返回一个布尔值。例如,假设main函数是

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

我做了一个检查,看看传入的两个函数是否相同

def logical_equiv(function1, function2):
    if function1 == function2:
         return True

但是如何检查函数1和函数2的实际返回值呢?更清楚地说,假设function1取两个参数P和Q,然后返回(不是P)或(不是Q),function2也取两个参数P和Q,然后返回不(P和Q),我如何在我的逻辑等价函数中检查这一点?我试过了

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

但这会返回错误NameError: name 'P' is not defined 从logical_equiv打印出函数将返回内存地址。你知道吗


Tags: and函数参数ifmaindefnot逻辑
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

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

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

我想你应该:

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

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

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

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

相关问题 更多 >