2013-11-15 11 views
69

मैं एक सुरक्षा प्रणाली लिख रहा हूं जो अनधिकृत उपयोगकर्ताओं तक पहुंच से इनकार करता है।`= == बी या सी या डी हमेशा सत्य का मूल्यांकन क्यों करता है?

import sys 

print("Hello. Please enter your name:") 
name = sys.stdin.readline().strip() 
if name == "Kevin" or "Jon" or "Inbar": 
    print("Access granted.") 
else: 
    print("Access denied.") 

यह अधिकृत उपयोगकर्ताओं तक पहुंच प्रदान करता है, लेकिन यह अनधिकृत उपयोगकर्ताओं को भी देता है!

Hello. Please enter your name: 
Bob 
Access granted. 

ऐसा क्यों होता है? मैंने स्पष्ट रूप से केवल पहुंच प्रदान करने के लिए कहा है जब name केविन, जॉन या इनबर के बराबर है। मैंने विपरीत तर्क, if "Kevin" or "Jon" or "Inbar" == name भी कोशिश की है, लेकिन परिणाम वही है।

+0

स्थिति लिखने का सबसे बेवकूफ तरीका 'अगर केविन "," जॉन "," इनबर "] में नाम होगा:' – djinn

उत्तर

103

कई मामलों में, पाइथन प्राकृतिक अंग्रेजी की तरह दिखता है और व्यवहार करता है, लेकिन यह एक ऐसा मामला है जहां वह अमूर्तता विफल हो जाती है। लोग संदर्भ संकेतों का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि "जॉन" और "इनबर" ऑब्जेक्ट्स "बराबर" क्रिया में शामिल हो गए हैं, लेकिन पायथन दुभाषिया अधिक शाब्दिक दिमागी है।

if name == "Kevin" or "Jon" or "Inbar": 

तार्किक के बराबर है:

if (False) or ("Jon") or ("Inbar"): 

or ऑपरेटर एक सकारात्मक truth value साथ पहला तर्क चुनता है:

if (name == "Kevin") or ("Jon") or ("Inbar"): 

कौन सा, उपयोगकर्ता बॉब के लिए, बराबर करने के लिए है

if ("Jon"): 

और चूंकि "जॉन" का सकारात्मक सत्य मूल्य है, if ब्लॉक निष्पादित करता है। दिए गए नाम के बावजूद मुद्रित होने के लिए "पहुंच प्रदान" का कारण बनता है।

यह सभी तर्क अभिव्यक्ति if "Kevin" or "Jon" or "Inbar" == name पर भी लागू होता है। पहला मान, "Kevin", सत्य है, इसलिए if ब्लॉक निष्पादित करता है।


इस सशर्त को सही तरीके से बनाने के दो सामान्य तरीके हैं।

  1. उपयोग कई == ऑपरेटरों को स्पष्ट रूप से प्रत्येक मान के खिलाफ जांच करने के लिए:
    if name == "Kevin" or name == "Jon" or name == "Inbar":

  2. मान्य मान का एक अनुक्रम बनाएं, और in ऑपरेटर का उपयोग सदस्यता के लिए परीक्षण करने के लिए:
    if name in ("Kevin", "Jon", "Inbar"):

दो में से सामान्य में पसंदीदा होना चाहिए क्योंकि यह आसान है पढ़ने और तेज़ी से पढ़ने के लिए:

In [1]: name = "Inbar" 

In [2]: %timeit name == "Keven" or name == "Jon" or name == "Inbar" 
10000000 loops, best of 3: 116 ns per loop 

In [3]: %timeit name in ("Keven", "Jon", "Inbar") 
10000000 loops, best of 3: 65.2 ns per loop 
संबंधित मुद्दे