2015-09-20 2 views
5

मुझे लगता है कि यह सुरक्षित है:जांच कर रहा है कि कुंजी कुंजीपटल में है और उसे "अगर" सुरक्षित में मूल्य प्राप्त हो रहा है?

if key in test_dict: 
    if test_dict[key] == 'spam': 
     print('Spam detected!') 

लेकिन यह सुरक्षित है?

if key in test_dict and test_dict[key] == 'spam': 
    print('Spam detected!') 

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

+3

हाँ, दोनों स्निपेट समकक्ष और "सुरक्षित" हैं। –

उत्तर

13

हाँ, यह सुरक्षित है, अजगर होगा शॉर्ट सर्किट अगर झूठी में पहली अभिव्यक्ति परिणाम यह हुआ कि क्या यह if स्थिति में दूसरी अभिव्यक्ति का मूल्यांकन नहीं करेगा।

लेकिन आपकी स्थिति को करने का एक बेहतर तरीका .get() का उपयोग करना होगा, जो None देता है यदि कुंजी शब्दकोश में मौजूद नहीं है। उदाहरण -

if test_dict.get(key) == 'spam': 
    print('Spam detected!') 
+4

यह बराबर नहीं है - स्पैम कुंजी के मूल्य 'कोई नहीं' हो सकता है। –

+1

उस मामले में इसके समकक्ष, स्थिति संतुष्ट नहीं होगी। 'कोई नहीं 'स्पैम के बराबर नहीं है। –

+0

@AnandSKumar तो, एकमात्र ऐसी स्थिति जिसमें यह काम नहीं करेगा, जब मैं कोई नहीं खोज रहा हूं? –

3

and test_dict[key] == 'spam': का मूल्यांकन केवल if key in test_dictTrue है, यह आपके पहले कोड के समान व्यवहार करेगा जहां आपके पास नेस्टेड है।

जब आप and का उपयोग करते हैं तो अभिव्यक्ति के दोनों तरफ सही होना चाहिए ताकि key in test_dict गलत हो जाए तो कोड शॉर्ट सर्किट होगा।

का उपयोग करते हुए अपने and दृष्टिकोण वास्तव में सबसे कारगर है, खासकर जब अभिव्यक्ति की बाएं हाथ की ओर गलत है:

In [13]: d = {k:k for k in range(10000)} 
In [14]: timeit 99999 in d and d[100] == "foo" 
10000000 loops, best of 3: 48.2 ns per loop 

In [15]: timeit d.get(9000) == "foo" 
10000000 loops, best of 3: 155 ns per loop 
In [16]: timeit 100 in d and d[100] == "foo 
10000000 loops, best of 3: 119 ns per loo  
In [17]: timeit d.get(100) == "foo" 
10000000 loops, best of 3: 141 ns per loop 
+0

हाँ लेकिन अधिक कुशल है बस 'डी [100] ==" foo "' लेकिन इसे छोड़कर एक कोशिश के साथ। जब तक कि अधिकांश चाबियाँ ताना में न हों। – strubbly

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