दिलचस्प पोस्ट
UIButton की पृष्ठभूमि का रंग कैसे बदल सकता है जबकि इसे हाइलाइट किया जाता है? NSOrderedSet उत्पन्न एक्सेसर्स में फेंक दिया अपवाद क्या एंड्रॉइड ड्रॉएबल डायरेक्टरी में उपनिर्देशिकाएं हो सकती हैं? UITableView हेडर अनुभाग को अनुकूलित करें पीडीओ में लगातार कनेक्शन का उपयोग करने के क्या नुकसान हैं सक्रिय बच्चे के माता-पिता के लिए जटिल सीएसएस चयनकर्ता jqGrid गतिशील रूप से ग्रिड पेजर आईडी को हल करें? एक ड्रॉपडाउन सूची में विकल्पों के साथ चित्र डालना विभिन्न फ्लेक्स कंटेनरों में फ्लेक्स आइटम के लिए समान ऊंचाई स्तंभ विंडो बैच फ़ाइल में सबस्ट्रिंग को कैसे बदलें वेब ब्राउजरों को कैश की गई सामग्री को https पर कैसा होगा? एंड्रॉइड पूर्व पॉपुलेटेड डाटाबेस क्या jtextfield और jlist का उपयोग करने के लिए एक स्वत: पूर्ण होना संभव है? डबल चेक किए गए लॉकिंग के इस उदाहरण में अस्थिर का उपयोग क्यों किया जाता है उचित नियंत्रक वर्ग में मुख्य नियंत्रक या अन्य नियंत्रकों से वस्तुओं का उपयोग करते हुए javafx

क्यों `एक == बी या सी या डी 'हमेशा सही पर मूल्यांकन करता है?

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

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 , लेकिन परिणाम एक ही है।

वेब के समाधान से एकत्रित समाधान "क्यों `एक == बी या सी या डी 'हमेशा सही पर मूल्यांकन करता है?"

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

 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 ब्लॉक निष्पादित करता है।


इस सशर्त रूप से उचित रूप से निर्माण करने के दो सामान्य तरीके हैं।

  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