我想寫一個語句在Python中的邏輯蘊涵。 喜歡的東西:python中是否有蘊含邏輯運算符?
if x => y:
do_sth()
當然,我知道我可以使用:
if (x and y) or not x:
do_sth()
但有一個邏輯運算符,這在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