"X y में नहीं" या "y में x नहीं"


97

सदस्यता के लिए परीक्षण करते समय, हम उपयोग कर सकते हैं:

x not in y

या वैकल्पिक रूप से:

not x in y

इस अभिव्यक्ति के लिए xऔर इसके आधार पर कई संभावित संदर्भ हो सकते हैं y। उदाहरण के लिए, यह एक सबस्ट्रिंग चेक, सूची सदस्यता, प्रमुख कुंजी अस्तित्व के लिए हो सकता है।

  • क्या दो रूप हमेशा समतुल्य होते हैं?
  • क्या कोई पसंदीदा वाक्यविन्यास है?

जवाबों:


112

वे हमेशा एक ही परिणाम देते हैं।

वास्तव में, not 'ham' in 'spam and eggs'एक "ऑपरेशन" में नहीं बल्कि "ऑपरेशन" में एक एकल "प्रदर्शन करने के लिए विशेष रूप से लापरवाह होना दिखाई देता है और फिर परिणाम का नकारात्मक:

>>> import dis

>>> def notin():
    'ham' not in 'spam and eggs'
>>> dis.dis(notin)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not_in():
    not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not__in():
    not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        

>>> def noteq():
    not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT           
             10 POP_TOP             
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE      

मैंने पहले सोचा था कि वे हमेशा एक ही परिणाम देते हैं, लेकिन यह notअपने आप में एक कम पूर्ववर्ती तार्किक नकारात्मक संचालक है, जिसे a in bकिसी अन्य बूलियन अभिव्यक्ति के रूप में आसानी से लागू किया जा सकता है , जबकि not inसुविधा और स्पष्टता के लिए एक अलग ऑपरेटर था ।

ऊपर की बेचैनी का पता चल रहा था! ऐसा लगता है कि notस्पष्ट रूप से एक तार्किक निषेध ऑपरेटर है, लेकिन फॉर्म not a in bविशेष आवरण है, ताकि यह वास्तव में सामान्य ऑपरेटर का उपयोग नहीं कर रहा है। यह not a in bवस्तुतः एक ही अभिव्यक्ति के a not in bबजाय एक ही अभिव्यक्ति बनाता है , जिसके परिणामस्वरूप समान मूल्य होता है।


4
ध्यान रखें कि यह केवल एक कार्यान्वयन विवरण है। मैं not x in xsडॉक्स में भी उल्लेख नहीं कर सकता ।
प्रेत ०३

1
@ phant0m बिल्कुल; जिस तरह से आप के बारे में सोचना चाहिए not x in xsहै not (x in xs)। लेकिन तथ्य यह है कि इसे ठीक उसी बायोटेक में पार्स करके कार्यान्वित किया जाता है, जैसा x not in xsकि बहुत स्पष्ट रूप से दर्शाता है कि उन्हें हमेशा समान होना चाहिए, जैसे कि not x == yबनाम जैसी चीजों के विपरीत, x != yजो एक ही परिणाम देना चाहिए , लेकिन (कार्यान्वयन के आधार पर) नहीं करना चाहिए__eq__ और __ne__शामिल)।
बेन

11
आपने एक CPython peephole अनुकूलन में भाग लिया है ; एक संकलन-समय अनुकूलन है कि अन्य पायथन कार्यान्वयन जैसे कि जेथॉन और आयरनपिथॉन अनदेखी या कॉपी करने के लिए स्वतंत्र हैं (यह भाषा विनिर्देश का हिस्सा नहीं है)।
मार्टिजन पीटरर्स

15

  1. नहीं, कोई अंतर नहीं है।

    ऑपरेटर not inका व्युत्क्रम सही मान होता है in

    - पायथन प्रलेखन

  2. मुझे लगता not inहै कि यह पसंद किया जाता है क्योंकि यह अधिक स्पष्ट है और उन्होंने इसके लिए एक विशेष मामला जोड़ा है।


7

वे अर्थ में समान हैं, लेकिन pycodestyle पायथन स्टाइल गाइड चेकर (जिसे पहले pep8 कहा जाता है)not in ऑपरेटर को नियम E713 में पसंद करते हैं :

E713: सदस्यता के लिए परीक्षण होना चाहिए not in

यह भी देखें "पायथन if x is not Noneया if not x is None?" शैली की एक बहुत ही समान पसंद के लिए।


3

दूसरों ने पहले से ही यह स्पष्ट कर दिया है कि दो बयान, काफी निचले स्तर के बराबर हैं।

हालाँकि, मुझे नहीं लगता कि किसी ने अभी तक इस बात पर जोर दिया है कि चूंकि यह चुनाव आप पर निर्भर करता है, इसलिए आपको करना चाहिए

वह फ़ॉर्म चुनें जो आपके कोड को यथासंभव पठनीय बनाता है।

और जरूरी नहीं कि किसी के लिए जितना संभव हो उतना पठनीय हो , भले ही वह उद्देश्य के लिए एक अच्छी बात हो। नहीं है, यकीन है कि कोड के रूप में पठनीय है आप के लिए , जब से तुम एक है जो सबसे अधिक संभावना है बाद में इस कोड को वापस आने के लिए और इसे पढ़ने के लिए प्रयास करने के लिए कर रहे हैं।


यदि आप एक बड़ी टीम या कोड पर काम कर रहे हैं, जो कुछ समय के लिए अछूता रहने की संभावना है, तो यह अधिक संभावना हो सकती है कि किसी और को इसे बनाए रखना है।
टॉमी हर्बर्ट


1

सिंथेटिक वे एक ही बयान कर रहे हैं। मुझे यह 'ham' not in 'spam and eggs'बताने की जल्दी होगी कि स्पष्ट मंशा बताती है, लेकिन मैंने कोड और परिदृश्यों को देखा है जिसमें not 'ham' in 'spam and eggs'दूसरे की तुलना में स्पष्ट अर्थ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.