टी एल; डॉ
हम दो तार्किक ऑपरेटरों के दो व्यवहार को सारांशित करके शुरू करते हैं andऔर or। ये मुहावरे हमारी चर्चा का आधार बनेंगे।
and
पहला फल्सी मान लौटाएं यदि कोई हैं, तो अभिव्यक्ति में अंतिम मान लौटाएं।
or
पहला सत्य मान लौटाएं यदि कोई हो, और अभिव्यक्ति में अंतिम मान लौटाएं।
व्यवहार को भी डॉक्स में संक्षेप में प्रस्तुत किया गया है , विशेष रूप से इस तालिका में:

केवल ऑपरेटर अपने ऑपरेटर की परवाह किए बिना एक बूलियन मान लौटाता है not।
"सत्यता", और "सत्य" मूल्यांकन
बयान
len(args) and max(args) - min(args)
एक है बहुत pythonic संक्षिप्त (और यकीनन कम पठनीय) और कहा कि "अगर के रास्ते argsखाली नहीं है, का परिणाम लौटने max(args) - min(args)", अन्यथा वापसी 0। सामान्य तौर पर, यह एक if-elseअभिव्यक्ति का अधिक संक्षिप्त प्रतिनिधित्व है । उदाहरण के लिए,
exp1 and exp2
को (मोटे तौर पर) अनुवाद करना चाहिए:
r1 = exp1
if r1:
r1 = exp2
या, समकक्ष,
r1 = exp1 if exp1 else exp2
इसी तरह,
exp1 or exp2
के बराबर है,
r1 = exp1
if not r1:
r1 = exp2
कहाँ exp1और exp2मनमानी अजगर वस्तुओं, या कुछ वस्तु लौटाने वाले भाव हैं। यहां तार्किक andऔर orऑपरेटरों के उपयोग को समझने की कुंजी यह समझ रही है कि वे बूलियन मूल्यों को संचालित करने या वापस करने के लिए प्रतिबंधित नहीं हैं। सत्यता मूल्य वाली किसी भी वस्तु का परीक्षण यहाँ किया जा सकता है। यह भी शामिल है int, str, list, dict, tuple, set, NoneType, और उपयोगकर्ता परिभाषित वस्तुओं। लघु परिपालन नियम अभी भी लागू होते हैं।
लेकिन सच्चाई क्या है?
यह संदर्भित करता है कि सशर्त अभिव्यक्तियों में उपयोग किए जाने पर वस्तुओं का मूल्यांकन कैसे किया जाता है। @ पैट्रिक हाउ ने इस पोस्ट में सच्चाई को संक्षेप में प्रस्तुत किया है ।
निम्नलिखित को छोड़कर सभी मूल्यों को "सत्य" माना जाता है, जो "मिथ्या" हैं:
None
False
0
0.0
0j
Decimal(0)
Fraction(0, 1)
[] - एक खाली list
{} - एक खाली dict
() - एक खाली tuple
'' - एक खाली str
b'' - एक खाली bytes
set() - एक खाली set
- एक खाली
range, जैसेrange(0)
- जिसके लिए वस्तुएं
obj.__bool__() रिटर्न False
obj.__len__() रिटर्न 0
एक "सत्य" मूल्य चेक ifया while
स्टेटमेंट द्वारा किए गए चेक को संतुष्ट करेगा । हम "सत्य" और "मिथ्या" का उपयोग boolमूल्यों Trueऔर अंतर से अलग करने के लिए करते
हैं False।
कैसे andकाम करता है
हम ओपी के प्रश्न पर एक चर्चा के रूप में चर्चा करते हैं कि इन उदाहरणों में ये ऑपरेटर कैसे हैं।
परिभाषा के साथ एक फ़ंक्शन दिया
def foo(*args):
...
मैं शून्य या अधिक तर्कों की सूची में न्यूनतम और अधिकतम मूल्य के बीच के अंतर को कैसे वापस करूं?
न्यूनतम और अधिकतम खोजना आसान है (इनबिल्ट फ़ंक्शन का उपयोग करें!)। यहां एकमात्र स्नैग उचित रूप से कोने के मामले को संभाल रहा है जहां तर्क सूची खाली हो सकती है (उदाहरण के लिए, कॉलिंग foo())। हम andऑपरेटर की बदौलत दोनों को एक पंक्ति में कर सकते हैं :
def foo(*args):
return len(args) and max(args) - min(args)
foo(1, 2, 3, 4, 5)
# 4
foo()
# 0
चूंकि andउपयोग किया जाता है, दूसरी अभिव्यक्ति का मूल्यांकन भी किया जाना चाहिए यदि पहला है True। ध्यान दें, यदि पहली अभिव्यक्ति का मूल्यांकन सत्य है, तो वापसी मूल्य हमेशा दूसरी अभिव्यक्ति का परिणाम होता है । यदि पहली अभिव्यक्ति का मूल्यांकन फल्सी होने के लिए किया जाता है, तो लौटाया गया परिणाम पहली अभिव्यक्ति का परिणाम है।
उपरोक्त फ़ंक्शन में, यदि fooएक या अधिक तर्क प्राप्त होते हैं, len(args)तो 0(एक सकारात्मक संख्या) से अधिक है , इसलिए लौटाया गया परिणाम है max(args) - min(args)। OTOH, अगर कोई तर्क पारित कर रहे हैं, len(args)है 0जो Falsy है, और 0दिया जाता है।
ध्यान दें कि इस फ़ंक्शन को लिखने का एक वैकल्पिक तरीका होगा:
def foo(*args):
if not len(args):
return 0
return max(args) - min(args)
या, अधिक संक्षेप में,
def foo(*args):
return 0 if not args else max(args) - min(args)
यदि निश्चित रूप से, इनमें से कोई भी कार्य किसी भी प्रकार की जाँच नहीं करता है, तो जब तक आप प्रदान किए गए इनपुट पर पूरी तरह से भरोसा नहीं करते हैं , तब तक इन निर्माणों की सादगी पर भरोसा न करें ।
कैसे orकाम करता है
मैं orएक समान उदाहरण के साथ एक समान फैशन में काम करने की व्याख्या करता हूं ।
परिभाषा के साथ एक फ़ंक्शन दिया
def foo(*args):
...
आप fooसभी नंबरों को वापस करने के लिए कैसे पूरा करेंगे 9000?
हम orयहां कोने के मामले को संभालने के लिए उपयोग करते हैं। हम इस fooरूप में परिभाषित करते हैं:
def foo(*args):
return [x for x in args if x > 9000] or 'No number over 9000!'
foo(9004, 1, 2, 500)
# [9004]
foo(1, 2, 3, 4)
# 'No number over 9000!'
fooसभी नंबरों को बनाए रखने के लिए सूची पर एक निस्पंदन करता है 9000। यदि ऐसी कोई संख्या मौजूद है, तो सूची की समझ का नतीजा एक गैर-रिक्त सूची है, जो सत्य है, इसलिए इसे वापस कर दिया जाता है (यहां कार्रवाई में छोटी चक्कर लगाना)। यदि ऐसी कोई संख्या मौजूद नहीं है, तो सूची COMP का परिणाम []गलत है। तो अब दूसरी अभिव्यक्ति का मूल्यांकन किया जाता है (एक गैर-रिक्त स्ट्रिंग) और वापस किया जाता है।
सशर्त का उपयोग करते हुए, हम इस फ़ंक्शन को फिर से लिख सकते हैं,
def foo(*args):
r = [x for x in args if x > 9000]
if not r:
return 'No number over 9000!'
return r
पहले की तरह, यह संरचना त्रुटि से निपटने के मामले में अधिक लचीली है।
and(साथ हीor) बूलियन मूल्यों के साथ काम करने या लौटने के लिए प्रतिबंधित नहीं है।