2013-04-24 11 views
8

में मूल्यांकन किया गया है यदि आपके पास कोई कथन है जहां कई चर या फ़ंक्शंस का मूल्यांकन किया जाता है, तो किस क्रम में उनका मूल्यांकन किया जाता है?किस क्रम में पायथन

if foo > 5 or bar > 6: 
    print 'foobar' 

इस विशेष मामले में, पांच के खिलाफ का मूल्यांकन किया जाएगा फू हो और उसके बाद 6 (बाएं से दाएं) के खिलाफ बार या छोड़ दिया करने के लिए सही मूल्यांकन किया जाएगा? मुझे लगता है कि एक ही क्रम में or और and का मूल्यांकन किया जाता है।

+3

यह एक 'if' बयान के मूल्यांकन के आदेश के साथ कोई संबंध नहीं है, लेकिन एक' or' अभिव्यक्ति के मूल्यांकन के आदेश के साथ। आपको 'x = (foo> 5 या bar> 6) 'के लिए सटीक समान नियम मिलते हैं, या, उस मामले के लिए, केवल' foo> 5 या bar> 6' अपने विवरण के रूप में। – abarnert

+2

चारों ओर खेलने का प्रयास करें और देखें कि क्या होता है। इस तरह का नतीजा क्या होगा;) यदि सही या गलत और झूठा और झूठा या झूठा: ' –

उत्तर

18

बाएं खंड का मूल्यांकन पहले किया जाएगा, और फिर सही केवल तभी होगा जब पहला वाला False होगा।

यही कारण है कि आप की तरह सामान कर सकते हैं:

if not person or person.name == 'Bob': 
    print "You have to select a person and it can't be Bob" 

के बिना यह तोड़ने।

इसके विपरीत, एक and खंड के साथ, सही खंड केवल तभी पहले एक True है मूल्यांकन किया जाएगा: जब personNone है

if person and person.name: 
    # ... 

अन्यथा एक अपवाद फेंका किया जाएगा।

7

इसका मूल्यांकन बाएं से दाएं किया जाएगा।

>>> def a(): 
...  print 'a' 
...  return False 
... 
>>> def b(): 
...  print 'b' 
...  return False 
... 
>>> print a() or b() 
a 
b 
False 
>>> def c(): 
...  print 'c' 
...  return True 
... 
>>> print c() or a() 
c 
True 
1

पायथन के or ऑपरेटर शॉर्ट सर्किट और यह सही करने के लिए छोड़ दिया मूल्यांकन किया जाएगा:

if (foo > 5) or (bar > 6): 
    print 'foobar' 

तो foo > 5, तो bar > 6 भी, True or <anything> के रूप में परीक्षण नहीं किया जाएगा True हो जाएगा। यदि foo> 5 नहीं है, तो bar > 6 का परीक्षण किया जाएगा।

3

थोड़ा आगे ब्लेंडर के विवरण का विस्तार करने के लिए, or ऑपरेटर कुछ और निर्मित है:

<expression A> or <expression B> 

यह expression A पहले का मूल्यांकन करेंगे; यदि यह True का मूल्यांकन करता है तो expression A ऑपरेटर द्वारा वापस किया जाता है। तो 5 or <something>55True पर मूल्यांकन करेगा।

यदि expression AFalse, expression B का मूल्यांकन किया गया है। तो 0 or 55 लौटाएगा क्योंकि 0False का मूल्यांकन करता है।

बेशक आप श्रृंखला इस जितना आप चाहते हैं के रूप में कर सकते हैं के

:

<expr 1> or <expr 2> or <expr 3> or ... or <expr n> 

सामान्य तौर पर, orपहले अभिव्यक्ति जो True का मूल्यांकन वापस आ जाएगी, लेकिन इसके मूल मान रखने के लिए। यदि कोई अभिव्यक्ति नहीं है जो True का मूल्यांकन करती है, तो यह केवल अंतिम अभिव्यक्ति (जो False का मूल्यांकन करती है) को वापस कर देगी।

and ऑपरेटर एक समान लेकिन उलटा तरीके से काम करता है। यह पहले अभिव्यक्ति को वापस करेगा जो False का मूल्यांकन करता है, लेकिन इसका मूल मान रखें। यदि कोई अभिव्यक्ति नहीं है जो False का मूल्यांकन करती है, तो यह केवल अंतिम अभिव्यक्ति (जो True का मूल्यांकन करेगी) को वापस कर देगी।

एक उदाहरण के रूप में, दोनों 0 and 5 और 5 and 00 वापस आ जाएगी क्योंकि 0False का आकलन करती है, लेकिन 2 and 33 वापस आ जाएगी क्योंकि 3 पिछले अभिव्यक्ति है और सब कुछ True मूल्यांकन करता है।

किसी भी तरह से (प्रश्न पर वापस आने के लिए): सभी अभिव्यक्तियों का मूल्यांकन बाएं से दाएं से किया जाता है, और यदि ऊपर से कोई नियम इसे अनुमति देता है, तो आगे की अभिव्यक्ति को छुआ नहीं जाएगा।

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