2013-03-22 75 views
6

在我學習如何使用in語句使if語句更好地工作的方式上,我寫了一些不必要的複雜代碼。代碼片段後面有兩個問題。python「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:會自動返回True或False。有誰知道如果是這樣的話?

第二個問題:上面的代碼返回3行,這取決於ans實際上是否在answeranswer2中。我試圖通過更換,像這樣的相關部分,以消除:

if ans in answer[i] == True:

這不得不讓代碼只輸出else:語句的奇效。那麼有誰能向我解釋python如何解釋if ans in answer[i]:if ans in answer[i] == True:的區別?

回答

5

至於ans in answer[i]ans in answer[i] == True,簡單的區別:Python之膨脹後一種形式中出來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

作爲一個方面說明,它通常被認爲是不好的風格,以明確檢查TrueFalse - 簡單地寫if x in y好多了。

15

要以相反的順序回答您的問題,明確與True進行比較並不適合您的原因是,Python沒有按照您預期的方式解釋表達式。 Python的解析器比較表達式,這樣就可以把它們結合在一起,並得到一個合理的結果,這樣的特殊處理:

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

注意,Python有處理這件事的一個操作,因爲如果你把它分解爲兩個運算無論哪種方式,你沒有得到相同的結果:

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

這些行爲不同,因爲在括號中的部分首先計算並返回True,但True != "a"所以整個表達式返回false。

通過權利,上述應該實際上不會對您的程序產生任何影響。不幸的是,Python的通過相同的機制,==所以當你鏈接這些他們一起被解釋爲一個序列像上述處理in,所以Python如下實際評價它:

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

這是古怪的,可以說是反直覺的,但不幸的是它的工作原理。要獲得的行爲,你想你需要使用括號強制Python來單獨評估第一部分:

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

上面所有的內容表示,== True是多餘的,因爲,當你懷疑的表情已經返回boolean並且if聲明可以直接對其進行評估。

現在回到你的其他問題,我相信你要做的是取一行輸入,並根據用戶輸入的內容產生一個相應的輸出行。您可以將in運營商爲一個字符串和一個列表,看看是否該字符串列表,它允許你完全消除您的for循環:

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" 

這第一次測試,如果輸入匹配任何字符串在answer,然後answer2相同。當然,你可以達到類似的效果,但也支持其他形式如YeS通過簡單地將輸入轉換爲小寫並將其與小寫形式比較:

if ans.lower() == "yes": 
    print "Yes!" 
# (and so forth)