जवाबों:
हाँ, दोनों and
और or
ऑपरेटरों शॉर्ट-सर्किट - डॉक्स देखें ।
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
पायथन में ऑपरेटर एक बूलियन ( या ) के बजाय एक ऑपरेंड का मान लौटाते हैं । उदाहरण के लिए:True
False
ऑपरेशन
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
।
0
falsy (इसलिए यह सिर्फ नहीं है कर रहे हैं 0
, यह 0.0
, 0j
, decimal.Decimal(0)
, fractions.Fraction(0)
, आदि), के रूप में सभी संग्रह लंबाई के साथ कर रहे हैं 0
(ताकि आप क्या सूचीबद्ध के शीर्ष पर, b''
[Py3], u''
[Py2] और set()
/ frozenset()
कर रहे हैं सभी बिल्ट-इन जो कि मिथ्या के रूप में मूल्यांकन करते हैं), लेकिन उपयोगकर्ता-परिभाषित / तीसरे पक्ष के प्रकार अपने स्वयं को परिभाषित कर सकते हैं ( __bool__
[Py3] / __nonzero__
[Py2] सीधे, या अप्रत्यक्ष रूप से परिभाषित करके __len__
)।