क्या अजगर शॉर्ट-सर्किटिंग का समर्थन करता है?


जवाबों:



192

ऑपरेटर में शॉर्ट-सर्किट व्यवहार and, or:

आइए पहले यह निर्धारित करने के लिए एक उपयोगी फ़ंक्शन को परिभाषित करें कि क्या कुछ निष्पादित हुआ है या नहीं। एक साधारण फ़ंक्शन जो एक तर्क को स्वीकार करता है, एक संदेश प्रिंट करता है और इनपुट को अपरिवर्तित लौटाता है।

>>> def fun(i):
...     print "executed"
...     return i
... 

एक का निरीक्षण कर सकते पायथन के शॉर्ट-सर्किट व्यवहार की and, orनिम्न उदाहरण में ऑपरेटरों:

>>> fun(1)
executed
1
>>> 1 or fun(1)    # due to short-circuiting  "executed" not printed
1
>>> 1 and fun(1)   # fun(1) called and "executed" printed 
executed
1
>>> 0 and fun(1)   # due to short-circuiting  "executed" not printed 
0

नोट: निम्न मान दुभाषिया द्वारा गलत माना जाता है:

        False    None    0    ""    ()    []     {}

समारोह में शॉर्ट-सर्किट व्यवहार: any(), all():

अजगर का any()औरall() फ़ंक्शंस भी शॉर्ट-सर्किटिंग का समर्थन करते हैं। जैसा कि डॉक्स में दिखाया गया है; वे अनुक्रम-क्रम के प्रत्येक तत्व का मूल्यांकन करते हैं, जब तक कि एक परिणाम नहीं मिलता है जो मूल्यांकन में एक प्रारंभिक निकास की अनुमति देता है। दोनों को समझने के लिए नीचे दिए गए उदाहरणों पर विचार करें।

फ़ंक्शन any()जाँचता है कि क्या कोई तत्व सत्य है। जैसे ही ट्रू का सामना होता है और यह ट्रू रिटर्न करता है, इसे निष्पादित करना बंद कर देता है।

>>> any(fun(i) for i in [1, 2, 3, 4])   # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])   
executed                               # bool(0) = False
executed                               # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True

फ़ंक्शन all()सभी तत्वों की जाँच करता है कि यह सही है और जैसे ही एक गलत सामना होता है, निष्पादित करना बंद कर देता है:

>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False

जंजीर तुलना में लघु-परिचालित व्यवहार:

इसके अतिरिक्त, पायथन में

तुलनाओं को मनमाने ढंग से जंजीर किया जा सकता है ; उदाहरण के लिए, x < y <= zके बराबर है x < y and y <= z, सिवाय इसके कि yकेवल एक बार मूल्यांकन किया जाता है (लेकिन दोनों मामलों zमें मूल्यांकन नहीं किया जाता है जब x < yगलत पाया जाता है)।

>>> 5 > 6 > fun(3)    # same as:  5 > 6 and 6 > fun(3)
False                 # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3)    # 5 < 6 is True 
executed              # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7)   # 4 <= 6 is True  
executed              # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3    # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False

संपादित करें:
ध्यान देने के लिए एक और दिलचस्प बिंदु : - तार्किक and,or पायथन में ऑपरेटर एक बूलियन ( या ) के बजाय एक ऑपरेंड का मान लौटाते हैं । उदाहरण के लिए:TrueFalse

ऑपरेशन x and yपरिणाम देता हैif x is false, then x, else y

अन्य भाषाओं के विपरीत जैसे &&, ||C में ऑपरेटर जो 0 या 1 पर वापस आते हैं।

उदाहरण:

>>> 3 and 5    # Second operand evaluated and returned 
5                   
>>> 3  and ()
()
>>> () and 5   # Second operand NOT evaluated as first operand () is  false
()             # so first operand returned 

इसी तरह orऑपरेटर रिटर्न सबसे अधिक मूल्य छोड़ता है जिसके लिए bool(value)== Trueदूसरा सबसे गलत मूल्य (शॉर्ट-सर्किट व्यवहार के अनुसार), उदाहरण:

>>> 2 or 5    # left most operand bool(2) == True
2    
>>> 0 or 5    # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()

तो, यह कैसे उपयोगी है? प्रैक्टिकल पायथन बाय मैग्नस लाइ हेटलैंड में दिए गए एक उदाहरण का उपयोग करते हैं :
मान लीजिए कि कोई उपयोगकर्ता अपना नाम दर्ज करना चाहता है, लेकिन वह कुछ भी दर्ज करने का विकल्प चुन सकता है, जिस स्थिति में आप डिफ़ॉल्ट मान का उपयोग करना चाहते हैं '<unknown>'। यदि आप एक बयान का उपयोग कर सकते हैं, लेकिन आप चीजों को बहुत रसीले तरीके से भी बता सकते हैं:

In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name: 

In [172]: name
Out[172]: '<Unkown>'

दूसरे शब्दों में, अगर रॉ_इनपुट से रिटर्न वैल्यू सही है (खाली स्ट्रिंग नहीं), तो इसे नाम दिया जाता है (कुछ भी नहीं बदलता है); अन्यथा, डिफ़ॉल्ट '<unknown>'को असाइन किया गया है name


1
लघु वक्रोक्ति: मिथ्या मूल्यों की स्पष्ट सूची थोड़ा भ्रामक है। किसी भी प्रकार के एक या एक से अधिक झूठे मूल्य हो सकते हैं। परंपरा के मुताबिक, मूल्य के साथ सभी संख्यात्मक प्रकार 0falsy (इसलिए यह सिर्फ नहीं है कर रहे हैं 0, यह 0.0, 0j, decimal.Decimal(0), fractions.Fraction(0), आदि), के रूप में सभी संग्रह लंबाई के साथ कर रहे हैं 0(ताकि आप क्या सूचीबद्ध के शीर्ष पर, b''[Py3], u''[Py2] और set()/ frozenset()कर रहे हैं सभी बिल्ट-इन जो कि मिथ्या के रूप में मूल्यांकन करते हैं), लेकिन उपयोगकर्ता-परिभाषित / तीसरे पक्ष के प्रकार अपने स्वयं को परिभाषित कर सकते हैं ( __bool__[Py3] / __nonzero__[Py2] सीधे, या अप्रत्यक्ष रूप से परिभाषित करके __len__)।
शैडो रेंजर

@ShadowRanger यहाँ आपकी टिप्पणी मेरे जवाब को पूरा करेगी। इस नोट को जोड़ने के लिए धन्यवाद।
बृजेश चौहान

इसके अलावा, अजगर शॉर्ट सर्कुलेटेड कंडीशन का डबल-मूल्यांकन करता है, अगर बाद में बूलियन के रूप में उपयोग किया जाता है ... जब तक कि वे एक स्टेटमेंट में नहीं होते हैं, जो कि निजी है: gist.github.com/earonesty/08e9cbe05a5e0583feb8a34cc538010
Erik Aronesty

48

हाँ। अपने अजगर दुभाषिया में निम्नलिखित का प्रयास करें:

तथा

>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero

या

>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.