2012-03-21 11 views
5

वहाँ के बीच अजगर 3.x में पर्याप्त अंतर है के बीच '== नहीं' और 'एक तार्किक अंतर है:वहाँ = (बिना है)

for each_line in data_file: 
    if each_line.find(":") != -1: 
     #placeholder for code 
     #more placeholder 

और

for each_line in data: 
    if not each_line.find(":") == -1: 
     #placeholder for code 
     #more placeholder 

मेरे प्रश्न उपर्युक्त उपयोग के लिए विशेष नहीं है, लेकिन यह अधिक सामान्य या आवश्यक है - क्या यह वाक्य रचनात्मक अंतर अलग-अलग तरीके से काम कर रहा है, भले ही परिणाम समान है? क्या कोई तार्किक अंतर है? क्या ऐसे कार्य हैं जहां कोई अधिक उपयुक्त है या यह पूरी तरह स्टाइलिस्ट अंतर है? यदि यह केवल स्टाइलिस्ट है, जिसे पाइथन प्रोग्रामर द्वारा क्लीनर माना जाता है?

इसके अलावा, यह पूछने के विपरीत उदाहरण है कि is और == के बीच क्या अंतर है? पूर्व, जैसे उत्तरार्द्ध, वस्तु पहचान और वस्तु मूल्य समानता का अंतर है? मेरा मतलब है, मेरे उपर्युक्त उदाहरण में, not का उपयोग करने में अंतर्निहित है?

उत्तर

6

मैं यह समझ के रूप में, कार्यात्मक वे नहीं पूरी तरह से समान हैं; यदि आप एक वर्ग के खिलाफ तुलना कर रहे हैं, वर्ग के रूप में इस उदाहरण में, __eq__ जो जब तुलना == का उपयोग कर कहा जाता है

तो करने का विरोध एक सदस्य समारोह, __ne__ जो जब तुलना ऑपरेटर का उपयोग कहा जाता है हो सकता था! =, ,
not (a == b) तर्क के रूप में एक पर __eq__ कहेंगे, ख के साथ है, तो not परिणाम
(a != b) एक पर __ne__ कहेंगे, तर्क के रूप में ख के साथ।

मैं पहली विधि तुलना

+0

धन्यवाद, यह मेरे लिए सही मायने रखता है, और यह तर्क के सवाल का जवाब देता है। – gogolgadgets

1

आपका पहला उदाहरण यह है कि आपको find के परिणाम का परीक्षण कैसे करना चाहिए।

आपका दूसरा उदाहरण बहुत अधिक कर रहा है। यह each_line.find(":") == -1 अभिव्यक्ति के परिणामस्वरूप boolean not निष्पादित कर रहा है।

इस संदर्भ में, जहां आप not का उपयोग करना चाहते हैं, तब आपके पास ऐसा कुछ है जिसे आप सत्यता या झूठीपन के लिए परीक्षण कर सकते हैं।
उदाहरण के लिए, रिक्त स्ट्रिंग '' गलत का आकलन:

s = '' 
if not s: 
    print('s is the empty string') 

आप बूलियन not साथ एक छोटा सा पहचान परीक्षण भाव is और is not conflating कर रहे हैं।

कैसे आप एक पहचान परीक्षण था का एक उदाहरण:

result_of_comparison = each_line.find(":") == -1 
if result_of_comparison is False: # alternatively: is not True 
    pass 
+0

धन्यवाद, इससे मुझे व्यावहारिक और स्टाइलिस्ट मतभेदों को समझने में मदद मिली है। – gogolgadgets

4

अलग rich comparison तरीकों आप == या != का उपयोग के आधार पर कहा जाता है के लिए उपयोग (का उपयोग कर! =) होगा।

class EqTest(object): 
    def __eq__(self, other): 
     print "eq" 
     return True 
    def __ne__(self, other): 
     print "ne" 
     return False 

a = EqTest() 
b = EqTest() 

print not (a == b) 
# eq 
# False 
print a != b 
# ne 
# False 

जहाँ तक मुझे पता है, आप कुछ उपयोगकर्ता परिभाषित वस्तुओं के लिए सभी में निर्मित प्रकार है, लेकिन सैद्धांतिक रूप से वे अलग हो सकता था कार्यान्वयन के लिए एक ही परिणाम मिल जाएगा।

मैं not और == के बजाय != का उपयोग करता हूं क्योंकि यह दो के बजाय एक ऑपरेशन है।

+0

+1 मेरे उत्तर से प्रश्न के लिए अधिक उत्तर के लिए +1। – bernie

संबंधित मुद्दे