2013-05-06 4 views
9

मैं लॉजिकल निहितार्थ के साथ अजगर में एक बयान लिखना चाहता हूं। कुछ की तरह:क्या अजगर में एक प्रभाव तार्किक ऑपरेटर है?

if x => y: 
    do_sth() 

बेशक, मैं मैं इस्तेमाल कर सकते हैं पता है:

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

लेकिन वहाँ अजगर में इस के लिए एक तार्किक ऑपरेटर है?

उत्तर

15

p => qnot(p) or q जैसा ही है, तो आप इसे आजमा सकते हैं! अगर वहाँ पायथन में इस के लिए एक एकल तार्किक ऑपरेटर है

+0

और उस से (x और y) सरल है या एक्स नहीं। धन्यवाद –

+5

टीटीएल सहमत है - लेकिन कोड में देखना जरूरी नहीं है, हालांकि मूल से सरल है। एक फ़ंक्शन - यानी 'का अर्थ है (x, y) '- विचार को स्थानांतरित करने में अक्सर मदद कर सकता है, अगर ऐसा निर्माण अक्सर नाम के वारंट के लिए पर्याप्त होता है। – user2246674

+5

@ user2246674 सहमत हैं, मैं इसे स्पष्टता के लिए एक समारोह बनाने की सलाह दूंगा। –

5

आपका प्रश्न पूछता है, सरल उत्तर है नहीं: The docs सूची बूलियन संचालन, और अजगर बस ऐसा कुछ भी नहीं है।

जाहिर है, Juampi's answer बताते हैं कि, तर्कसंगत समकक्ष संचालन हैं जो कम छोटे हैं, लेकिन आपके द्वारा पूछे जाने वाले कोई भी ऑपरेटर नहीं हैं।

+0

कृपया [इस] (http://stackoverflow.com/questions/16405892/is-there-an-implication-logical-operator-in-python/33768787#33768787) उत्तर पर एक नज़र डालें। ऐसा लगता है कि सब कुछ [डॉक्स] में नहीं पाया जा सकता है (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

सिर्फ इसलिए कि यह हास्यास्पद है: एक्स => y अजगर में bool(x) <= bool(y) हो सकता है।

if y ** x: 
    do_sth() 

यह पढ़ता है::

+3

और यह (आखिरकार) निर्णायक सबूत है कि 'ट्रू' होना चाहिए और 'झूठी' बूलियन के लिए '0' होना चाहिए! ('True == 1' के वर्तमान पायथन सम्मेलन के बजाए)। तब हमारे पास 'x => y' मिलान' y <= x' (जो दाएं से बाएं निहितार्थ की तरह दिखता है) बूलियन के लिए होगा। –

1

एक बातचीत निहितार्थ ऑपरेटर नहीं है y एक्स से गर्भित जाता है।

https://github.com/cosmologicon/pywat

+0

हां। यही वह है जिसकी तलाश में मैं हूं। और ऐसा लगता है कि इस बातचीत के निहितार्थ को अनियंत्रित किया गया है, इसलिए @ लैटी का जवाब मूल रूप से गलत है। –

+1

@running।टी यह ऐसा कुछ है जो 'x => y' जैसा ही प्रभाव होता है, लेकिन उस उद्देश्य के लिए ऑपरेटर नहीं है। यह पावर ऑपरेटर है, और यह एक तार्किक ऑपरेटर नहीं है, बल्कि एक संख्यात्मक है। यह 'ट्रू' या 'गलत' नहीं लौटाता है, लेकिन एक संख्या। यह धीमा है, और संभावित रूप से अस्पष्ट और पढ़ने के लिए कठिन होने का जिक्र नहीं करने के लिए संभावित रूप से बग पेश कर सकता है। मैं * यह * कभी भी ऐसा करने के खिलाफ अनुशंसा करता हूं, और इसके बजाय [जुम्पी के उत्तर] (http://stackoverflow.com/a/16405931/722121) के अनुसार 'नहीं (पी) या q' का उपयोग करेगा। –

0

को क्रेडिट मैं एक अधिक पठनीय एक लाइनर तर्क है

x_implies_y = y if x else True 

अपने मूल उदाहरण में होगा:

if (y if x else True): do_sth() 
संबंधित मुद्दे