कई मामलों में, पायथन प्राकृतिक अंग्रेजी की तरह दिखता है और व्यवहार करता है, लेकिन यह एक ऐसा मामला है जहां यह अमूर्तता विफल हो जाती है। लोग यह निर्धारित करने के लिए संदर्भ सुराग का उपयोग कर सकते हैं कि "जॉन" और "इनबार" वस्तुएं क्रिया "बराबरी" में शामिल हो गई हैं, लेकिन पायथन दुभाषिया अधिक शाब्दिक दिमाग है।
if name == "Kevin" or "Jon" or "Inbar":
तार्किक रूप से इसके समकक्ष है:
if (name == "Kevin") or ("Jon") or ("Inbar"):
उपयोगकर्ता बॉब के लिए, जो इसके बराबर है:
if (False) or ("Jon") or ("Inbar"):
or
ऑपरेटर एक सकारात्मक के साथ पहला तर्क चुनता सच्चाई मूल्य :
if ("Jon"):
और जब से "जॉन" का एक सकारात्मक सत्य मूल्य है, द if
ब्लॉक निष्पादित होता है। यही कारण है कि दिए गए नाम की परवाह किए बिना "एक्सेस दी गई" मुद्रित किया जाता है।
इस तर्क के सभी अभिव्यक्ति पर भी लागू होते हैं if "Kevin" or "Jon" or "Inbar" == name
। पहला मान, "Kevin"
सत्य है, इसलिए if
ब्लॉक निष्पादित करता है।
इस सशर्त को ठीक से बनाने के दो सामान्य तरीके हैं।
==
प्रत्येक मान के विरुद्ध स्पष्ट रूप से जांच करने के लिए कई ऑपरेटरों का उपयोग करें :
if name == "Kevin" or name == "Jon" or name == "Inbar":
मान्य मानों का एक क्रम लिखें, और in
सदस्यता के लिए परीक्षण करने के लिए ऑपरेटर का उपयोग करें :
if name in {"Kevin", "Jon", "Inbar"}:
दो के सामान्य में दूसरे को प्राथमिकता दी जानी चाहिए क्योंकि यह पढ़ना आसान है और तेजी से भी:
>>> import timeit
>>> timeit.timeit('name == "Kevin" or name == "Jon" or name == "Inbar"', setup="name='Inbar'")
0.4247764749999945
>>> timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")
0.18493307199999265
उन लोगों के लिए जो सबूत चाहते हैं कि if a == b or c or d or e: ...
वास्तव में इस तरह से पार्स किया गया है। अंतर्निहित ast
मॉड्यूल एक उत्तर प्रदान करता है:
>>> import ast
>>> ast.parse("if a == b or c or d or e: ...")
<_ast.Module object at 0x1031ae6a0>
>>> ast.dump(_)
"Module(body=[If(test=BoolOp(op=Or(), values=[Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), Name(id='c', ctx=Load()), Name(id='d', ctx=Load()), Name(id='e', ctx=Load())]), body=[Expr(value=Ellipsis())], orelse=[])])"
>>>
तो test
के if
इस तरह के बयान दिखता है:
BoolOp(
op=Or(),
values=[
Compare(
left=Name(id='a', ctx=Load()),
ops=[Eq()],
comparators=[Name(id='b', ctx=Load())]
),
Name(id='c', ctx=Load()),
Name(id='d', ctx=Load()),
Name(id='e', ctx=Load())
]
)
एक देख सकते हैं, यह बूलियन ऑपरेटर है or
करने के लिए कई आवेदन किया values
है, अर्थात्, a == b
और c
, d
, और e
।