टी एल; डॉ
हम दो तार्किक ऑपरेटरों के दो व्यवहार को सारांशित करके शुरू करते हैं 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
) बूलियन मूल्यों के साथ काम करने या लौटने के लिए प्रतिबंधित नहीं है।