2013-05-06 41 views

Trả lời

15

p => q cũng giống như not(p) or q, vì vậy bạn có thể thử điều đó!

+0

Và đó là đơn giản hơn (x và y) hoặc không x. Cảm ơn –

+5

TTL đồng ý - nhưng nó không nhất thiết phải dễ dàng nhìn thấy trong mã, mặc dù đơn giản hơn so với bản gốc. Một hàm - tức là 'ngụ ý (x, y)' - có thể giúp chuyển ý tưởng hơn, nếu một cấu trúc như vậy xảy ra thường đủ để đảm bảo một tên. – user2246674

+5

@ user2246674 Đồng ý, tôi khuyên bạn nên thực hiện chức năng này để làm rõ. –

5

Câu hỏi của bạn hỏi nếu có một toán tử logic duy nhất cho điều này trong Python, câu trả lời đơn giản là không: The docs liệt kê các phép toán boolean và Python đơn giản là không có bất cứ thứ gì như thế.

Rõ ràng, như Juampi's answer chỉ ra, có các hoạt động tương đương về logic hợp lý ngắn hơn một chút, nhưng không có toán tử đơn lẻ nào như bạn đã yêu cầu.

+0

Vui lòng xem [this] (http://stackoverflow.com/questions/16405892/is-there-an-implication-logical-operator-in-python/33768787#33768787) câu trả lời. Có vẻ như không phải mọi thứ đều có thể tìm thấy trong [docs] (http://docs.python.org/3.3/reference/expressions.html#boolean-operations). –

+0

@ running.t Nó không có trong tài liệu vì câu trả lời đó sai - không có toán tử như vậy, thay vào đó, nó là sự lạm dụng của một toán tử khác xảy ra để tạo ra cùng một kết quả. Kết quả cuối cùng của việc sử dụng đó sẽ là vô hiệu, không hiệu quả, mã không hiệu quả có thể gây ra lỗi. –

1

Chi tiết bổ sung dựa trên những gì tôi đã tìm thấy ở đây và ở đó khi tôi đang tìm kiếm nhà điều hành ngụ ý: bạn có thể sử dụng thông minh để xác định nhà khai thác của riêng mình. Đây là một ví dụ đang chạy được chú thích với các nguồn dẫn tôi đến kết quả này.

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

Chỉ vì điều này thật buồn cười: x => y có thể là bool(x) <= bool(y) trong python.

+3

Và đây là (cuối cùng) bằng chứng kết luận rằng 'True' phải là' -1' và 'False' phải là' 0' cho các boolean! (Thay vì quy ước Python hiện tại của 'True == 1'.) Bởi vì sau đó chúng ta sẽ có' x => y' khớp với 'y <= x' (giống như hàm ý từ phải sang trái) cho các boolean. –

1

Có một nhà khai thác ý nghĩa ngược lại:

if y ** x: 
    do_sth() 

này lần đọc: Nếu y được ngụ ý bởi x.

Tín dụng cho https://github.com/cosmologicon/pywat

+0

Có. Điều này thật đúng với gì mà tôi đã tìm kiếm. Và có vẻ như hàm ý ngược này là không có giấy tờ, vì vậy câu trả lời của @Latty về cơ bản là không chính xác. –

+1

@running.t Đây là điều xảy ra có cùng tác dụng với 'x => y', nhưng không phải là toán tử cho mục đích đó. Đây là toán tử điện, và không phải là toán tử logic, mà là toán tử số. Nó không trả về 'True' hoặc' False', nhưng là một số. Điều này là chậm hơn, và có khả năng có thể giới thiệu lỗi, chưa kể đến việc vô cùng không rõ ràng và khó đọc. Tôi sẽ * rất cao * khuyên bạn không nên làm điều này, và thay vào đó sẽ sử dụng 'không (p) hoặc q' theo [câu trả lời của Juampi] (http://stackoverflow.com/a/16405931/722121). –

0

tôi sẽ tranh luận một dễ đọc hơn một liner sẽ

x_implies_y = y if x else True 

Trong ví dụ ban đầu của bạn:

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