我目前正在尝试编写一个函数,该函数将两个真值函数作为其参数,并根据它们是否在逻辑上等效返回一个布尔值。例如,假设主要功能是
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打印出该函数会返回一个内存地址。
答案 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
当然,您需要定义P
和Q
。请记住,function1
只是对函数的引用,而function1()
调用函数,返回其值。
此外,要检查function1
和function2
的输出是否相同,只需执行以下操作:
if function1() == function2():
...