Есть ли логический оператор implication в python?

Я хотел бы написать заявление на python с логическим подтекстом. Что-то вроде:

if x => y:
  do_sth()

конечно, я знаю, что мог бы использовать:

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

но есть ли логический оператор для этого в python?

6 ответов


p => q Это то же самое, что not(p) or q, Так что вы можете попробовать!


ваш вопрос спрашивает, Есть ли один логический оператор для этого в Python, простой ответ-нет:документы список логических операций, и Python просто не имеет ничего подобного.

очевидно, как ответ Juampi указывает, что есть логически эквивалентные операции, которые немного короче, но нет одиночных операторов, как вы просили.


просто потому, что это смешно: x => y может быть bool(x) <= bool(y) в python.


дополнительные сведения, основанные на том, что я нашел здесь и там, как я искал оператор импликации : вы можете использовать умный хак, чтобы определить свои собственные операторы. Вот пример с аннотацией источников привело меня к этому результату.

#!/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)

существует оператор обратной импликации:

if y ** x:
  do_sth()

это гласит: если y подразумевается x.

кредиты на https://github.com/cosmologicon/pywat


Я бы сказал, что более читаемый однострочный будет

x_implies_y = y if x else True

в исходном примере:

if (y if x else True): do_sth()