2015-12-07 41 views
0

聲明我有以下代碼:兩個如果用一個邏輯運算符

fhand=open('mbox-short.txt') 
count=0 
for line in fhand: 
    words=line.split() 
    print(words) 
    if len(words)==0: continue 
    if words[0]!='From': continue 
    print(words[2]) 

此代碼打印輸出的有效(我試圖從mbox.txt文件得到發送的電子郵件的天)。當我嘗試這兩個「如果」語句組合如下:

if words[0]!='From' and len(words)==0: continue 

我得到這個錯誤:

['From', '[email protected]', 'Sat', 'Jan', '5', '09:14:16', '2008'] 
Sat 
['Return-Path:', '<[email protected]>'] 
Traceback (most recent call last): 
    File "untitled.py", line 7, in <module> 
    print(words[2]) 
IndexError: list index out of range 

我看到,在返回路徑行中出現的問題,但它爲什麼採取考慮到?不應該組合if語句與兩個分離的if語句具有相同的輸出嗎?

+2

如果一個***或***其他條件成立,您想要「繼續」。不僅如果*兩個都是真的。 – deceze

回答

2

您遇到的問題是您翻轉了測試順序。您現在正在測試的長度後試圖檢查什麼的第一個值是:

if words[0]!='From' and len(words)==0: continue 

Python的檢查條件,由左到右,所以它會首先檢查if words[0]!='From'然後進行測試len(words)==0,但是如果words是空的那麼第一次測試會嘗試訪問不存在的索引並創建錯誤。

您需要使用這個命令來代替,並使用or運營商爲deceze指出,因爲你只關心這些一個True,不能同時使用。

if len(words)==0 or words[0]!='From': continue 
2

的不同輸出顯示兩種解決方案是不等價的:你選擇了錯誤的操作。

原來會發生什麼?如果符合第一個條件,則執行continue。如果不是,則測試第二個,並根據需要循環。

此行爲是由一個運算符隱藏的。但這是or運營商。如果你按照正確的順序做,寄託都作品作爲想:

if len(words)==0 or words[0]!='From': continue 

讓我們看看會發生什麼:執行條件的第一部分。如果len(words)==0爲真,則會跳過後半部分(這稱爲短路)和循環continue d。這是好事,因爲如果評價儘管該長度0

只有如果長度 0,則執行第二測試words[0]將導致一個錯誤。

注意,有測試列表爲空的幾種方法:

  • len(words) == 0
  • not len(words)
  • not words

這兩種表述都True如果該列表是空的,如果不是,則爲False

+2

......儘管Pythonic的方式是說'如果不是單詞或單詞[0]!='從':'...或者,爲了澄清,如果(不是單詞)或單詞[0]!= 「從」:' –