में कोई भी परीक्षण नहीं, इनमें से कोई भी परीक्षण नहीं करता है।पायथन
if val != None:
if not (val is None):
if val is not None:
कौन सा बेहतर है, और क्यों?
में कोई भी परीक्षण नहीं, इनमें से कोई भी परीक्षण नहीं करता है।पायथन
if val != None:
if not (val is None):
if val is not None:
कौन सा बेहतर है, और क्यों?
if val is not None:
# ...
परीक्षण है कि एक चर None
पर सेट नहीं है के लिए pythonic मुहावरा है। इस मुहावरे का उपयोग declaring keyword functions with default parameters के मामले में विशेष रूप से किया जाता है। पाइथन में is
परीक्षण पहचान। क्योंकि चल रहे पायथन स्क्रिप्ट/प्रोग्राम में मौजूद None
का एक और एक उदाहरण है, is
इसके लिए इष्टतम परीक्षण है। Johnsyweb points out के रूप में, इस पर "प्रोग्रामिंग सिफारिशें" के तहत PEP 8 में चर्चा की गई है।
क्यों इस
if not (val is None):
# ...
यह करने के लिए पसंद किया जाता है के रूप में बस Zen of Python का हिस्सा है: "। पठनीयता मायने रखता है" अच्छा पायथन अक्सर pseudocode के करीब है।
बाद के दो में से कोई, val
के बाद से संभावित रूप से एक प्रकार है कि __eq__()
को परिभाषित करता है सच वापस जाने के लिए जब None
पारित हो सकता है।
यही नहीं बल्कि नृशंस है !=
उपयोग कर रहा है '__eq __()' के व्यवहार, और कुछ मुझे नहीं माना जाता था। कोने के मामले को पकड़ने के लिए अच्छा जवाब। –
gotgenes
से, प्रोग्रामिंग अनुशंसाएँ, PEP 8:
कोई नहीं की तरह एकमात्र करने के लिए तुलना हमेशा से किया जाना चाहिए 'है' या कभी नहीं समानता ऑपरेटरों 'नहीं है',।
इसके अलावा, लेखन से सावधान "अगर एक्स" जब आप वास्तव में मतलब "अगर एक्स कोई भी नहीं है" - जैसे परीक्षण करते समय कि कोई चर या तर्क जो पर डिफ़ॉल्ट है, कोई भी अन्य मूल्य पर सेट नहीं किया गया था। अन्य मान में (जैसे एक कंटेनर) हो सकता है जो एक बुलियन संदर्भ में गलत हो सकता है!
पीईपी 8 किसी भी पायथन प्रोग्रामर के लिए आवश्यक पढ़ना आवश्यक है।
+1 - उस – user2314737
सवालों के इन प्रकार के साथ सबसे अच्छा शर्त वास्तव में क्या अजगर करता है देखने के लिए है। dis
मॉड्यूल अविश्वसनीय रूप से जानकारीपूर्ण है:
>>> def f(val):
... if val != None:
... return True
... return False
...
>>> def g(val):
... if not (val is None):
... return True
... return False
...
>>> def h(val):
... if val is not None:
... return True
... return False
...
>>> import dis
>>> dis.dis(f)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 3 (!=)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
>>> dis.dis(g)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
>>> dis.dis(h)
2 0 LOAD_FAST 0 (val)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_GLOBAL 1 (True)
15 RETURN_VALUE
4 >> 16 LOAD_GLOBAL 2 (False)
19 RETURN_VALUE
ध्यान दें कि पिछले दो मामलों के संचालन के उसी क्रम (अजगर not (val is None)
पढ़ता है और is not
ऑपरेटर का उपयोग करता है) के लिए कम। पहले किसी के साथ तुलना करते समय !=
ऑपरेटर का उपयोग करता है।
के रूप में अन्य उत्तर से कहा, जब कोई नहीं के साथ तुलना एक बुरा विचार
के बारे में पता नहीं था betwen तुलना_op 9 और 3 में क्या अंतर है? – evolvedmicrobe
भी, "नहीं है" इस उद्देश्य के लिए बनाए गए विशेष सेमेन्टिक्स हैं (यह अभिव्यक्तियों का निर्माण कैसे किया जाता है इसका तार्किक परिणाम नहीं है; "1 (कोई नहीं है)" और "1 कोई नहीं है" के दो अलग-अलग परिणाम हैं। –
+1: मुझे यह संदर्भ पसंद आया - "अच्छा पायथन अक्सर अच्छे छद्म कोड के करीब होता है" – legesh
"कोई भी नहीं" सही लौटाता है। दिलचस्प। – Ries