python中是否有蕴含逻辑运算符?

python中是否有蕴含逻辑运算符?

问题描述:

我想写一个语句在Python中的逻辑蕴涵。 喜欢的东西:python中是否有蕴含逻辑运算符?

if x => y: 
    do_sth() 

当然,我知道我可以使用:

if (x and y) or not x: 
    do_sth() 

但有一个逻辑运算符,这在Python?

p => qnot(p) or q相同,所以你可以试试!

+0

而且比(x和y)simplier或不是x。谢谢 – 2013-05-06 19:39:09

+5

TTL同意 - 但它不一定很容易看到代码,虽然比原来简单。一个函数 - 也就是“暗示(x,y)” - 可能有助于更多地传达这个想法,如果这样的结构足够频繁地发生以保证名称的话。 – user2246674 2013-05-06 19:39:44

+5

@ user2246674同意,我会建议使这个功能清晰。 – 2013-05-06 19:42:22

您的问题在Python中是否存在单个逻辑运算符,简单的答案是否定的:The docs列表布尔运算,Python根本就没有这样的东西。

显然,正如Juampi's answer所指出的那样,逻辑上等价的操作有点短,但没有一个操作符正如你问的那样。

+0

请看看[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

+0

@ 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中。

+3

这是(最后)确凿的证据,证明布尔值的“真”应该是“-1”,“假”应该是“0”! (而不是当前Python惯例中的'True == 1')。因为那么我们就会为匹配布尔值的'y = x'(看起来像是从右到左的含义)匹配'x => y'。 – 2015-10-07 18:44:51

有一个相反的蕴涵算:

if y ** x: 
    do_sth() 

这写着:如果y由X暗示。

https://github.com/cosmologicon/pywat

+0

是的。这正是我所期待的。而且看起来这个相反的含义是没有记录的,所以@Latty的回答基本上是不正确的。 – 2015-11-18 10:08:27

+1

@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()