2010-07-25 10 views
8

पायथन डॉक्स का कहना है कि * और/वही प्राथमिकता है।
मुझे पता है कि पायथन में अभिव्यक्तियों का मूल्यांकन बाएं से दाएं से किया जाता है।पायथन ऑपरेटर प्राथमिकता

मैं कि में भरोसा करते हैं और मानते हैं कि जे j/मी हमेशा (जे जे)/मी कोष्ठकों से बचने के बराबर है सकते हैं?
यदि ऐसा है तो क्या मुझे लगता है कि यह सामान्य रूप से समान प्राथमिकता वाले ऑपरेटरों के लिए है?


पुनश्च: यह के रूप में सवाल मेरी प्रयोजनों के लिए ठीक है, मैं पूर्णांक केवल (ऊपर के उदाहरण की तरह) कोड कोष्ठकों के बिना, जो उस समय मेरे लिए बहुत संदिग्ध देखा पढ़ते समय यह करने के लिए आया था ।

+7

"स्पष्टता से स्पष्ट स्पष्ट है।", "अस्पष्टता के मुकाबले, अनुमान लगाने के लिए प्रलोभन से इनकार करें।" - पीईपी 20 – msw

+0

ब्रिटिश: यदि आप "पूर्णांक-केवल कोड" पढ़ रहे थे, तो आपको बहुत बड़ी समस्या है: इसे चलाने के लिए पायथन का किस संस्करण का उपयोग किया जाना था? क्या कोड में '__future__ आयात प्रभाग' से आगे है? क्या उसे '//' के रूप में पढ़ा जाना चाहिए और/या बदलना चाहिए // // '? –

+0

@ जॉन माचिन: ​​/ उस मामले में पूर्णांक विभाजन का अर्थ है, भविष्य की सामग्री के बिना पायथन 2.6 है, मैंने नोट किया कि जे * जे/एम (जे * जे)/मीटर जैसे कोड बराबर हैं, लेकिन स्थिरता के बारे में डरते थे यह व्यवहार। –

उत्तर

14

हां - वही प्राथमिकता वाले विभिन्न ऑपरेटर बाएं-सहयोगी हैं; यही है, दो बाएं आइटमों का संचालन किया जाएगा, फिर परिणाम और तीसरा आइटम, और इसी तरह।

एक अपवाद ** ऑपरेटर है:

>>> 2 ** 2 ** 3 
256 

इसके अलावा, तुलना ऑपरेटरों (==, >, वगैरह) एक साहचर्य तरीके से व्यवहार नहीं है, लेकिन बजाय (x [cmp] y) and (y [cmp] z) में x [cmp] y [cmp] z अनुवाद करते हैं।

+6

असाइनमेंट वास्तव में पायथन में एक अभिव्यक्ति नहीं है, और '=' सामान्य अर्थ में ऑपरेटर नहीं है; ऑपरेटर प्राथमिकता लागू नहीं होती है। कई लक्ष्यों के लिए असाइनमेंट स्पष्ट रूप से व्याकरण में परिभाषित किया गया है कि: एक ही ऑब्जेक्ट को एकाधिक लक्ष्यों को असाइन करना। –

+2

असाइनमेंट के बारे में गलत, कृपया उदाहरण बदलें! पाइथन में एकमात्र ऑपरेटर जो दाएं से बाएं से जुड़ा है '** **, जैसा कि' 2 ** 3 ** 4' –

+0

@Amber: (1) जैसा @Nas Banov ने कहा है, '**' केवल पाइथन ऑपरेटर जो सही-सहयोगी (2) है कि यह स्वयं के साथ सही-सहयोगी है, तथ्य का अचूक परिणाम [1] (3) तुलना ऑपरेटर गैर-सहयोगी हैं ... '<<<<' का अर्थ है न तो' (a < बी) <सी 'और न ही एक <(बी <सी) '--- कृपया अंतिम संपादन (अपना उत्तर हटाने) पर विचार करें। –

3

संक्षिप्त उत्तर: हाँ।

उसी डिब्बे में Python documentation says the following:

ऑपरेटर्स ही पूर्वता है। जब तक वाक्यविन्यास स्पष्ट रूप से दिया जाता है, ऑपरेटर बाइनरी होते हैं। उसी बॉक्स समूह में ऑपरेटर बाएं से दाएं (परीक्षणों को छोड़कर, परीक्षण सहित, जिनमें सभी की समान प्राथमिकता और बाएं से दाएं श्रृंखला होती है ... और एक्सपोनेंटिएशन, जो दाएं से बाएं समूह)।

तो दूसरे शब्दों में अपने प्रश्न का उत्तर हां में है, एक ही पूर्वता साथ ऑपरेटरों समूह Comparisions which chain rather than group से अलग बाएं से दाएं देगा:

>>> x = 0 
>>> y = 0 
>>> x == y == True 
False 
>>> (x == y) == True 
True 
>>> x == (y == True) 
True 

और Exponentation:

>>> 2 ** 2 ** 3 
256 
>>> (2 ** 2) ** 3 
64 
>>> 2 ** (2 ** 3) 
256 

इसके अलावा , असाइनमेंट में दाईं ओर की तरफ दाएं हाथ की तरफ से मूल्यांकन किया जाता है:

>>> x = 1 
>>> y = x = 2 
>>> y 
2 
+3

असाइनमेंट एक ऑपरेटर नहीं है (ऊपर देखें), और लक्ष्य वास्तव में * नहीं * बाएं दाएं मूल्यांकन किए गए हैं।असाइनमेंट के rhs का मूल्यांकन किया जाता है, और उसके बाद लक्ष्यों का मूल्यांकन किया जाता है * बाएं से दाएं * और असाइन किया जाता है। जब आप फ़ंक्शनकॉल के क्रम की जांच करते हैं तो आप भेद देख सकते हैं उदाहरण के लिए 'a()। A, b()। B = c()। C': आप देखेंगे कि' c() 'कहा जाता है, फिर 'सी' विशेषता पुनर्प्राप्त की जाती है, फिर' ए() 'कहा जाता है और 'ए' विशेषता को आवंटित किया जाता है, और उसके बाद केवल 'बी()' –

+0

के लिए वही होता है, मेरा मतलब यह नहीं था कि असाइनमेंट ऑपरेटर था, यह है यह आखिरी क्यों है मैंने असाइनमेंट के बारे में शब्द बदल दिया है। –

+0

आपका शब्द अभी भी इंगित करता है कि 'x' और' y' के मूल्यांकन के आदेश 'y' को दिए गए परिणाम के लिए मायने रखता है। ऐसा नहीं होता। 'X' और' y' के मान असाइनमेंट में कभी शामिल नहीं होते हैं। 'y = x = 2' का सख्ती से अर्थ है" 'y' को' y' और 'x'' असाइन करें, नहीं ''x' को' x' असाइन करें, फिर परिणामी मान 'x' से' y' "(जो, फिर से, आप देख सकते हैं कि जब आप अधिक जटिल असाइनमेंट लक्ष्य शामिल करते हैं, जैसे कि उन गुणों का उपयोग करते समय जो उन्हें अलग-अलग मानों पर सेट करते हैं, उन्हें निर्दिष्ट करते हैं। –

13

लेकिन, यदि यह आपके लिए संदिग्ध है - कोडर - और यह होना चाहिए क्योंकि आपको पूछना है, तो उम्मीद है कि यह कम से कम पाठक के लिए संदिग्ध होगा और स्पष्टता के लिए कुछ ऑक्टेट्स बर्बाद करेगा।

यदि आप एक कंपाइलर बनते हैं तो प्राथमिकता नियमों पर निर्भर होना बहुत अच्छा है।

टिप्पणी के लिए प्रतिक्रियाओं कहा:

व्यक्ति कोड है जो एक अस्पष्टता है कि आश्वासन के लिए बाहर परामर्श की आवश्यकता का सामना करना पड़ता पढ़ने के लिए, आप यह मान लेना चाहिए कि अगले पाठक आप की तुलना में कम समझ रखने वाले हो जाएगा और उन्हें बचाने के लिए और प्रयास एक ही निर्माण को पार्स करने से बचने योग्य मानव त्रुटि और उनके लिए कोष्ठक जोड़ना।

जैसा भी होता है, यहां तक ​​कि स्वीकृत उत्तर भी गलत था (तर्क में, प्रभाव नहीं, इसकी पहली टिप्पणी देखें) जिसे मैं नहीं जानता था और न ही उन लोगों का एक अंश था जो इसे ऊपर उठाते थे।

मूल बीजगणित के बारे में बयान के रूप में, ओपी में उपयोग किया जाने वाला विशेष उदाहरण निर्देशक है। ऑपरेटर प्राथमिकता के बावजूद अभिव्यक्ति j * (j/m) बीजगणितीय रूप से (j * j)/m के समान है। दुर्भाग्यवश, पायथन बीजगणित केवल "प्लेटोनिक आदर्श" बीजगणित का अनुमान है जो j और m की परिमाण के आधार पर किसी भी रूप के लिए गलत उत्तर उत्पन्न कर सकता है। उदाहरण के लिए:

>>> m = 1e306 
>>> m 
1e+306 
>>> j = 1e307 
>>> j 
9.9999999999999999e+306 
>>> j/m 
10.0 
>>> j*j 
inf 
>>> j * (j/m) 
1e+308 
>>> (j * j)/m 
inf 
>>> ((j * j)/m) == (j * (j/m)) 
False 

तो वास्तव में पायथन के (और मेरी एफपीयू) अर्ध बीजगणित की पहचान संपत्ति नहीं रखता है। और यह रूप में documentation notes के लिए आपकी मशीन पर अलग हो सकता है:

चल बिन्दु संख्या सी में लागू किया जाता है डबल का उपयोग कर अपने परिशुद्धता पर सभी दांव बंद कर रहे हैं जब तक आप का क्या मशीन आप के साथ काम कर रहे हैं पता है ।

यह दावा किया जा सकता है एक नहीं अतिप्रवाह के बालों किनारे पर काम कर रहे व्यापार है, और है कि कुछ हद तक सच है, लेकिन आपरेशन के एक आदेश और "सही" एक और के तहत दिए गए संदर्भ से हटा अभिव्यक्ति अनिश्चित है।

+0

अगर मैं कर सकता तो मैं इस जवाब में +10 दे दूंगा। :) यह एक बहुत ही महत्वपूर्ण बात है। – EOL

+0

एक पतंग दार्शनिक प्राप्त करने के लिए, स्वीकृत उत्तर वास्तव में पूछे गए प्रश्न का सही उत्तर है। जिसका अर्थ यह होना चाहिए कि सवाल गलत है, और यह उस बिंदु पर है जहां यह "कोष्ठक से परहेज" के बारे में पूछता है। हाल ही में एक काम करने वाली अभी तक कथित रूप से अपठनीय पुस्तकालय के माध्यम से गुजरना पड़ा, मैं पाइथन के व्यक्त मानकों में अंतर और सामान्य अभ्यास में इसका उपयोग करने के लिए उत्सुकता से संवेदनशील हूं। – msw

+2

आप क्यों मानते हैं कि मैं कोड लिखने की कोशिश कर रहा हूं? क्या होगा ... मैं पढ़ने की कोशिश कर रहा हूँ। –

संबंधित मुद्दे