論理的な含意を持つステートメントを python で書きたいと思います。何かのようなもの:
if x => y:
do_sth()
もちろん、私は使用できることを知っています:
if (x and y) or not x:
do_sth()
しかし、Pythonでこれに対する論理演算子はありますか?
論理的な含意を持つステートメントを python で書きたいと思います。何かのようなもの:
if x => y:
do_sth()
もちろん、私は使用できることを知っています:
if (x and y) or not x:
do_sth()
しかし、Pythonでこれに対する論理演算子はありますか?
p => q
は と同じなのでnot(p) or q
、試してみてください。
面白いからといって、 x => y はbool(x) <= bool(y)
python にある可能性があります。
あなたの質問は、Python にこれに対する単一の論理演算子があるかどうかを尋ねます。簡単な答えは「いいえ」です。ドキュメントにはブール演算がリストされており、Python にはそのようなものはありません。
明らかに、Juampiの回答が指摘しているように、少し短い論理的に同等の操作がありますが、あなたが尋ねたような単一の演算子はありません。
含意演算子を探していたときにあちこちで見つけたものに基づく追加の詳細: 巧妙なハックを使用して、独自の演算子を定義できます。これは、この結果につながるソースで注釈が付けられた実行中の例です。
#!/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_implies_y = y if x else True
元の例では:
if (y if x else True): do_sth()
XORが良い解決策であることがわかりました。A が B を意味するように変更して、A または B ではなく、xor を使用して A を次のように否定することができます。
A^1 or B
A xor(^) 1 は not A に等しいので