python中是否有蕴含逻辑运算符?
我想写一个语句在Python中的逻辑蕴涵。 喜欢的东西:python中是否有蕴含逻辑运算符?
if x => y:
do_sth()
当然,我知道我可以使用:
if (x and y) or not x:
do_sth()
但有一个逻辑运算符,这在Python?
p => q
与not(p) or q
相同,所以你可以试试!
您的问题在Python中是否存在单个逻辑运算符,简单的答案是否定的:The docs列表布尔运算,Python根本就没有这样的东西。
显然,正如Juampi's answer所指出的那样,逻辑上等价的操作有点短,但没有一个操作符正如你问的那样。
请看看[this](http://stackoverflow.com/questions/16405892/is-there-an-implication-logical-operator-in-python/33768787#33768787)的答案。看起来不是所有内容都可以在[docs]中找到(http://docs.python.org/3.3/reference/expressions.html#boolean-operations)。 – 2015-11-18 10:11:30
@ running.t它不在文档中,因为答案是错误的 - 没有这样的操作符,相反,它是滥用另一个操作符而发生相同的结果。使用它的最终结果将是可怕的,没有效率的代码可能会引入错误。 – 2015-11-22 14:03:50
基于我在这里和那里找到的内容,我在寻找一个蕴涵运算符的额外细节:您可以使用巧妙的hack来定义您自己的运算符。这里是一个正在运行的示例,它带有源代码,可以让我看到这个结果。
#!/usr/bin/python
# From http://code.activestate.com/recipes/384122/ (via http://stackoverflow.com/questions/932328/python-defining-my-own-operators)
class Infix:
def __init__(self, function):
self.function = function
def __ror__(self, other):
return Infix(lambda x, self=self, other=other: self.function(other, x))
def __rlshift__(self, other):
return Infix(lambda x, self=self, other=other: self.function(other, x))
def __or__(self, other):
return self.function(other)
def __rshift__(self, other):
return self.function(other)
def __call__(self, value1, value2):
return self.function(value1, value2)
from itertools import product
booleans = [False,True]
# http://stackoverflow.com/questions/16405892/is-there-an-implication-logical-operator-in-python
# http://jacob.jkrall.net/lost-operator/
operators=[
(Infix(lambda p,q: False), "F"),
(Infix(lambda p,q: True), "T"),
(Infix(lambda p,q: p and q), "&"),
(Infix(lambda p,q: p or q) , "V"),
(Infix(lambda p,q: p != q) , "^"),
(Infix(lambda p,q: ((not p) or not q)), "nad"),
(Infix(lambda p,q: ((not p) and not q)), "nor"),
(Infix(lambda p,q: ((not p) or q)), "=>"),
]
for op,sym in operators:
print "\nTruth tables for %s" % sym
print "\np\tq\tp %s q\tq %s p" % (sym,sym)
for p,q in product(booleans,repeat=2):
print "%d\t%d\t%d\t%d" % (p,q,p |op| q,q |op| p)
print "\np\tq\tr\tp %s q\tq %s r\t(p %s q) %s r\tp %s (q %s r)\tp %s q %s r" % (sym,sym,sym,sym,sym,sym,sym,sym)
for p,q,r in product(booleans,repeat=3):
print "%d\t%d\t%d\t%d\t%d\t%d\t\t%d\t\t%d" % (p,q,r,p |op| q,q |op| r, (p |op| q) |op| r, p |op| (q |op| r), p |op| q |op| r)
assert((p |op| q) |op| r == p |op| q |op| r)
只是因为它很有趣:x => y可能是bool(x) <= bool(y)
在Python中。
这是(最后)确凿的证据,证明布尔值的“真”应该是“-1”,“假”应该是“0”! (而不是当前Python惯例中的'True == 1')。因为那么我们就会为匹配布尔值的'y = x'(看起来像是从右到左的含义)匹配'x => y'。 – 2015-10-07 18:44:51
是的。这正是我所期待的。而且看起来这个相反的含义是没有记录的,所以@Latty的回答基本上是不正确的。 – 2015-11-18 10:08:27
@running。t这与'x => y'具有相同的效果,但不是用于此目的的操作符。这是电力运营商,不是合乎逻辑的运营商,而是数字运营商。它不会返回“True”或“False”,而是一个数字。这比较慢,并且可能会引入错误,更不用说难以理解且难以阅读。我会*非常*建议不要这样做,而是按照[Juampi的回答](http://stackoverflow.com/a/16405931/722121)使用'not(p)或q'。 – 2015-11-22 14:02:04
我认为一个更可读的一个班轮将
x_implies_y = y if x else True
在你原来的例子:
if (y if x else True): do_sth()
而且比(x和y)simplier或不是x。谢谢 – 2013-05-06 19:39:09
TTL同意 - 但它不一定很容易看到代码,虽然比原来简单。一个函数 - 也就是“暗示(x,y)” - 可能有助于更多地传达这个想法,如果这样的结构足够频繁地发生以保证名称的话。 – user2246674 2013-05-06 19:39:44
@ user2246674同意,我会建议使这个功能清晰。 – 2013-05-06 19:42:22