और न ही अजगर में तार्किक बयानों की प्राथमिकता


82

जहाँ तक मुझे पता है, C & C ++ में, NOT और OR के लिए प्राथमिकता क्रम> AND> नहीं है। लेकिन यह पायथन में एक समान तरीके से काम नहीं करता है। मैंने पायथन प्रलेखन में इसकी खोज करने की कोशिश की और असफल रहा (अनुमान लगाता हूं कि मैं थोड़ा अधीर हूं।)। क्या कोई मेरे लिए यह स्पष्ट कर सकता है?


2
क्या आप एक उदाहरण दे सकते हैं जहां ऑपरेटर पूर्वता काम नहीं करता है जैसे आपको लगता है कि यह करता है?
dodgethesteamroller

से बड़ा नहीं है और इससे बड़ा है या
CtrlAltF2

जवाबों:


95

संचालक पूर्वता पर प्रलेखन के अनुसार यह उच्चतम और निम्नतम स्तर तक नहीं है

यहां पूर्ण पूर्ववर्तीता तालिका है, सबसे कम पूर्वता सबसे अधिक है। एक पंक्ति में एक ही मिसाल है और बाएं से दाएं जंजीर है

 0. :=
 1. lambda
 2. ifelse
 3. or
 4. and
 5. not x
 6. in, not in, is, is not, <, <=, >, >=, !=, ==
 7. |
 8. ^
 9. &
 10. <<, >>
 11. +, -
 12. *, @, /, //, %
 13. +x, -x, ~x
 14. **
 14. await x
 15. x[index], x[index:index], x(arguments...), x.attribute
 16. (expressions...), [expressions...], {key: value...}, {expressions...}

1
ध्यान दें कि **अंकगणित ऑपरेटरों पर पूर्वता की बात आती है, तो कुछ अपवादों को फुटनोट में नोट किया गया है।
Martijn Pieters

1
यह मुझ में गणितज्ञ को भ्रमित करता है: अंकगणित में, हम कहेंगे कि अंकगणित संचालकों पर इसकी पूर्वता है। इसके दाईं ओर, **ऑपरेटर के पास अंकगणितीय संचालन के बारे में पूर्वता नहीं है, लेकिन इसके बाईं ओर है ... उदाहरण के लिए 5*2**2 == 5*(2**2),। हालाँकि ऐसा कहना सही है 2**-1 == 2**(-1)
फिलमकैके

@PhilMacKay - यह लग सकता है, कि जैसे शून्य का हिस्सा है intशाब्दिक, लेकिन जब यह साथ पार्स करने astमें यह मामला नहीं है - यह है UnaryOpके साथ USubऔर 1संकार्य के रूप में। असली कारण यह है, इसे पार्स करने का कोई और तरीका नहीं है। 2**बाइनरी माइनस के लिए Ie एक सही बाएं संकार्य नहीं है। इस प्रकार "प्रतिपादक प्राथमिकता अपवाद", लेकिन "केवल दाईं ओर"।
टॉमस गैंडर

32

आप निम्न परीक्षण कर सकते हैं ताकि andऔर की पूर्ववर्ती स्थिति का पता लगाया जा सके or

सबसे पहले, 0 and 0 or 1पायथन कंसोल में प्रयास करें

यदि orपहले बांधता है, तो हम 0आउटपुट के रूप में उम्मीद करेंगे।

मेरे कंसोल में, 1आउटपुट है। इसका अर्थ है andया तो पहले या उसके बराबर बांधता है or(हो सकता है कि अभिव्यक्तियों का मूल्यांकन बाएं से दाएं किया गया हो)।

फिर प्रयास करें 1 or 0 and 0

अगर orऔर andनिर्मित में बाएं से दाएं मूल्यांकन क्रम के साथ समान रूप से बांधते हैं, तो हमें 0आउटपुट के रूप में प्राप्त करना चाहिए ।

मेरे कंसोल में, 1आउटपुट है। तब हम यह निष्कर्ष निकाल सकते हैं कि andइसकी प्राथमिकता अधिक है or


3
अधिक स्पष्ट रूप से, भावों का मूल्यांकन इस प्रकार किया जाता है:((0 and 0) or 1)(1 or (0 and 0))
23

1
हालांकि, दूसरे अभिव्यक्ति में, (0 and 0)का मूल्यांकन नहीं किया जाता के रूप में (exp1 or exp2)सीधे वापस अगर exp1है True। इसी तरह पहली अभिव्यक्ति में, and 0कभी भी exp1 and exp2सीधे रिटर्न के रूप में भाग का मूल्यांकन नहीं किया जाता exp1है False
कॉन्क्लेप्टिकल्चर


5

बूलियन ऑपरेटरों में से, सबसे कमजोर से सबसे मजबूत तक, इस प्रकार है:

  1. or
  2. and
  3. not x
  4. is not; not in

जहां ऑपरेटर बाएं से दाएं समान मूल्यांकन प्रक्रिया के होते हैं।


क्षमा करें आपका # 2 तकनीकी रूप से सही है लेकिन फिर भी बहुत भ्रामक है। सबसे पहले, डॉक्टर बदलने के लिए प्रतीत नहीं होता है। दूसरे, आपकी राय # 2 (सुझाव देना andऔर not xबाएं से दाएं मूल्यांकन किया जाता है) तकनीकी रूप से आधिकारिक प्रभाव के बराबर है, लेकिन यह केवल इसलिए है क्योंकि जब "cond1 और cont2 में नहीं", तो अजगर को डिफ़ॉल्ट रूप से पहले cont2 की गणना करनी होगी।
रायलूओ

धन्यवाद @RayLuo, लेकिन यह तकनीकी रूप से भी सही नहीं था । मैं गलत तरीके से प्रदान की गई पंक्तियों को उस तालिका में पंक्तियों को विभाजित करते हुए अर्थ रख रहा था। आज 2.7 doc को देखते हुए orऔर फ़ायरफ़ॉक्सand का उपयोग करते हुए एक ही सेल में दिखाई देते हैं, लेकिन ओपेरा नहीं । के बीच पूर्वता में अंतर और स्पष्ट है (उदाहरण के लिए। बनाम ) के बीच और इतना कारण आप दे के लिए नहीं। मैं अपने उत्तर की मरम्मत यह दर्शाने के लिए करूँगा कि वास्तव में प्रलेखन क्या कहता है। orand1 or 0 and 0(1 or 0) and 0andnot x
ओसवाल्ड विर्ट

2

पायथन के लिए उन ऑपरेटरों के अन्य प्राथमिकता अनुक्रम होने का कोई अच्छा कारण नहीं है , जिनमें सी / सी ++ सहित अन्य सभी प्रोग्रामिंग भाषाओं में एक (लगभग) स्थापित है

आप इसे द पाइथन लैंग्वेज रेफरेंस , भाग ६.१६ में देख सकते हैं - ऑपरेटर पूर्वता, डाउनलोड करने योग्य (वर्तमान संस्करण के लिए और अन्य सभी मानक प्रलेखन के साथ पैक) https://docs.python.org/3/download.html से , या इसे पढ़ें यहां ऑनलाइन: 6.16 संचालक पूर्ववर्ती

लेकिन वहां अभी भी अजगर में कुछ है जो आप को गुमराह कर सकते है: परिणाम की andऔर orऑपरेटरों हो सकता है अलग से Trueया False- देखना 6.11 बूलियन संचालन एक ही दस्तावेज़ में।


1

कुछ सरल उदाहरण; ऑपरेटर की पूर्वता पर ध्यान दें (नहीं, और, या); मानव-व्याख्या में सहायता करने के लिए कोष्ठक बनाना।

a = 'apple'
b = 'banana'
c = 'carrots'

if c == 'carrots' and a == 'apple' and b == 'BELGIUM':
    print('True')
else:
    print('False')
# False

इसी प्रकार:

if b == 'banana'
True

if c == 'CANADA' and a == 'apple'
False

if c == 'CANADA' or a == 'apple'
True

if c == 'carrots' and a == 'apple' or b == 'BELGIUM'
True

# Note this one, which might surprise you:
if c == 'CANADA' and a == 'apple' or b == 'banana'
True

# ... it is the same as:
if (c == 'CANADA' and a == 'apple') or b == 'banana':
True

if c == 'CANADA' and (a == 'apple' or b == 'banana'):
False

if c == 'CANADA' and a == 'apple' or b == 'BELGIUM'
False

if c == 'CANADA' or a == 'apple' and b == 'banana'
True

if c == 'CANADA' or (a == 'apple' and b == 'banana')
True

if (c == 'carrots' and a == 'apple') or b == 'BELGIUM'
True

if c == 'carrots' and (a == 'apple' or b == 'BELGIUM')
True

if a == 'apple' and b == 'banana' or c == 'CANADA'
True

if (a == 'apple' and b == 'banana') or c == 'CANADA'
True

if a == 'apple' and (b == 'banana' or c == 'CANADA')
True

if a == 'apple' and (b == 'banana' and c == 'CANADA')
False

if a == 'apple' or (b == 'banana' and c == 'CANADA')
True
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.