2013-05-06 19 views
9

私はPythonで論理的な意味を持つステートメントを書こうと思います。 何かのように:もちろんPythonに含意論理演算子がありますか?

if x => y: 
    do_sth() 

、私が使用することができます知っている:

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

しかし、論理演算子は、Pythonで、このためにあるのでしょうか?

答えて

15

p => qnot(p) or qと同じですので、試してみてください!

+0

そして、それは(xとy)よりsimplierですまたはxではない。ありがとう –

+5

TTLは同意しますが、元のコードよりもシンプルですが、必ずしもコードで見るのが簡単ではありません。関数(つまり 'implies(x、y)')は、名前を保証するのに十分頻繁に発生するような場合に、アイデアをより多く移すのに役立つかもしれません。 – user2246674

+5

@ user2246674合意しましたが、わかりやすくするためにこれを機能にすることをお勧めします。 –

5

Pythonでこのための論理演算子が1つしかない場合、単純な答えはno:The docs list boolean operationsであり、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)ですべてが見つかるとは限りません。 –

+0

@ running.tその答えは間違っているので、ドキュメントにはありません。そのような演算子はありません。代わりに、同じ結果を生成する別の演算子を悪用しています。それを使用した結果、バグが導入される可能性のある非効率的なコードとなります。 –

1

ここで、私が暗示的な演算子を探していたときの追加の詳細:あなた自身の演算子を定義するために巧妙なハックを使うことができます。ここでは、この結果につながるソースを注釈した実行例を示します。

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

それはおかしいという理由だけます。x => yはpythonでbool(x) <= bool(y)である可能性があります。

+3

これは真理値が「-1」、ブール値が「0」でなければならないという最終的な証明です! (現在のPythonの 'True == 1'の代わりに)それで、ブール値に対して' y = x'(右から左への含意のように見える)にマッチする 'x => y'を持つことになるでしょう。 –

1

逆含意演算子があります:

if y ** x: 
    do_sth() 

これは読む:yはxで暗示されている場合。私は読みやすくワンライナーを主張するだろうhttps://github.com/cosmologicon/pywat

+0

はい。これはまさに私が探していたものです。そして、この逆の含意が文書化されていないように見えるので、@Lattyの答えは基本的には間違っています。 –

+1

@running。これはたまたま 'x => y'と同じ効果を持ちますが、その目的のための演算子ではありません。これは力の演算子であり、論理演算子ではなく、数値演算子です。 'True'や' False'を返さず、数値を返します。これは遅く、バグを招く可能性があります。私は*これまでこれを行うことを強くお勧めします、代わりに[Juampiの答え](http://stackoverflow.com/a/16405931/722121)に従って 'not(p)またはq 'を使用します。 –

0

クレジットは、あなたの元の例で

x_implies_y = y if x else True 

次のようになります。

if (y if x else True): do_sth() 
関連する問題