2013-03-22 3 views
6

मैंने if कथन बेहतर बनाने के लिए in कथन का उपयोग करने के तरीके के बारे में सीखने के तरीके पर इस अनावश्यक जटिल कोड को लिखा है। मेरे पास कोड स्निपेट के बाद दो प्रश्न हैं।क्या पाइथन "इन" कथन स्वचालित रूप से सत्य के रूप में वापस लौटते हैं

answer = ['Yes', 'yes', 'YES'] 
answer2 = ['No', 'no', 'NO'] 
ans = raw_input() 
for i in range(0, 3): 
    if ans in answer[i]: 
     print "Yes!" 
    elif ans in answer2[i]: 
     print "No!" 
    else: 
     print "Don't know what that means" 

पहला सवाल: मैं के रूप में सही है या गलत if n in listname: रिटर्न स्वचालित रूप से लगता है। क्या किसी को पता है कि क्या यह मामला है?

दूसरा प्रश्न: उपर्युक्त कोड ans पर निर्भर करता है जो या answer2 पर निर्भर करता है। मैं खत्म करने के लिए है कि इतनी तरह प्रासंगिक भागों की जगह करने की कोशिश की:

if ans in answer[i] == True:

इस कोड को उत्पादन केवल else: वक्तव्य देने की अजीब प्रभाव नहीं पड़ा। तो क्या कोई मुझे इस बात के बारे में बता सकता है कि पाइथन if ans in answer[i]: और if ans in answer[i] == True: की व्याख्या कैसे करता है?

उत्तर

5

जहाँ तक ans in answer[i] और ans in answer[i] == True, सरल के बीच अंतर के रूप में: अजगर ans in answer[i] and answer[i] == True है, जो जाहिर है, झूठी के बाद से एक स्ट्रिंग True के बराबर नहीं है के लिए बाहर बाद वाले मिलकर फैलता है।

एक सरल उदाहरण मदद मिल सकती है इस उदाहरण देकर स्पष्ट करना:

>>> a = [1, 2, 3] 
>>> 2 in a 
True 
>>> 2 in a == True 
False 
>>> 2 in a and a == True 
False 
>>> (2 in a) == True 
True 
>>> 2 in a == [1, 2, 3] 
True 
>>> 2 in a and a == [1, 2, 3] 
True 

सूचना कोष्ठकों जोड़ने के व्यवहार में बदलाव कैसे - इस 1 < x < 5 की तरह विस्तार के लिए समान है, के रूप में (1 < x) < 5 करने का विरोध किया।

एक साइड नोट के रूप में, इसे आमतौर पर True या False के लिए स्पष्ट रूप से जांचने के लिए खराब शैली माना जाता है - यह if x in y लिखना बहुत बेहतर है।

15

रिवर्स ऑर्डर में अपने प्रश्नों का उत्तर देने के लिए, True के साथ स्पष्ट रूप से तुलना करने का कारण यह नहीं है कि पाइथन ने आपके द्वारा अपेक्षित अभिव्यक्ति की व्याख्या नहीं की है। अजगर पार्सर ताकि आप उन्हें एक साथ श्रृंखला और एक समझदार परिणाम प्राप्त कर सकते हैं, इस तरह भाव की तुलना की विशेष हैंडलिंग है:

>>> "a" == "a" == "a" 
True 

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

>>> ("a" == "a") == "a" 
False 
>>> "a" == ("a" == "a") 
False 

ये अलग तरीके से व्यवहार क्योंकि कोष्ठक में हिस्सा पहले का मूल्यांकन किया और True देता है, लेकिन True != "a" तो पूरे अभिव्यक्ति गलत देता है।

उपरोक्त अधिकारों से वास्तव में आपके कार्यक्रम पर कोई प्रभाव नहीं होना चाहिए। दुर्भाग्य से, अजगर == इसलिए जब आप इन एक साथ श्रृंखला वे ऊपर की तरह एक दृश्य के रूप में व्याख्या कर रहे हैं के रूप में ही तंत्र के माध्यम से in संभालती है, तो वास्तव में यह अजगर का मूल्यांकन करता है इस प्रकार है:

>> "a" in ["a"] == True 
False 
>>> ("a" in ["a"]) and ("a" == True) 
False 

यह निराला और यकीनन जवाबी सहज है, लेकिन दुर्भाग्य से यह कैसे काम करता है।व्यवहार प्राप्त करने के लिए आप चाहते थे आप अलग से पहले भाग का मूल्यांकन करने के अजगर मजबूर करने के लिए कोष्ठक का उपयोग करने की आवश्यकता है: कहा जाता है कि सभी के साथ

>>> ("a" in ["a"]) == True 
True 

, == True बेमानी है, क्योंकि के रूप में आप पर शक, अभिव्यक्ति पहले से ही एक बूलियन रिटर्न और if कथन सिर्फ इसका मूल्यांकन कर सकता है।

अब अपनी दूसरी समस्या पर लौटने के लिए, मुझे विश्वास है कि आप जो करने की कोशिश कर रहे हैं वह इनपुट की एक पंक्ति लेता है और उपयोगकर्ता द्वारा दर्ज किए गए अनुसार, आउटपुट की एक समान रेखा का उत्पादन करता है। यदि इनपुट तार से मेल खाता

answer = ['Yes', 'yes', 'YES'] 
answer2 = ['No', 'no', 'NO'] 
ans = raw_input() 
if ans in answer: 
    print "Yes!" 
elif ans in answer2: 
    print "No!" 
else: 
    print "Don't know what that means" 

यह पहला परीक्षण: यदि स्ट्रिंग सूची है, जो आप पूरी तरह अपने for पाश समाप्त करने की सुविधा में है देखने के लिए एक स्ट्रिंग और एक सूची in ऑपरेटर आवेदन कर सकते हैं answer में, फिर answer2 के लिए समान है। बेशक, आप एक समान प्रभाव प्राप्त कर सकते हैं, लेकिन इनपुट को लोअरकेस में परिवर्तित करके और इसे लोअरकेस फॉर्म में तुलना करके YeS जैसे अन्य रूपों का समर्थन भी कर सकते हैं:

if ans.lower() == "yes": 
    print "Yes!" 
# (and so forth) 
संबंधित मुद्दे