2017-09-24 62 views
0

我是Python編程新手。我希望得到一些關於輸出背後原因的指導。我只是在網上做一些練習,遇到了一個我無法理解的問題。代碼如下:檢查列表中的值。在循環內部還是外部循環?

def dataset(data,n):  
    for value in data: 
     if n == value: 
      return True 
     else: 
      return False 

print(dataset([1,5,8,3], 3)) 
print(dataset([1,5,8,3],-1)) 

輸出將是False, False這是不正確的答案。

經過一番修補之後,我發現了這個問題。正確的代碼如下:

def dataset(data,n): 
    for value in data: 
     if n == value: 
      return True 

    return False 

print(dataset([1,5,8,3], 3)) 
print(dataset([1,5,8,3],-1)) 

輸出結果爲True, False這是正確的答案。

所以我的問題是爲什麼不同的輸出與return Falseelse: return False只是不同的投入?

+4

**所有**迭代完成後返回與第一次迭代期間總是返回完全不同。 –

+0

你真的只需要'返回數據'。循環是不必要的 –

+0

三位邏輯學家走進一家酒吧: *調酒師問道:「你們三個人都喜歡喝啤酒嗎?」 *第一個回覆「我不知道」 *第二個回覆「我也不知道」 *第三個回覆「是的,我們三個人都想喝啤酒」 –

回答

2

您的第一個答案在第一個項目之後停止,每個項目都運行false分支,而第二個答案僅在嘗試所有項目後運行false分支。

如果你改變了最終的代碼如下:

def dataset(data,n): 
    print("checking", data, n) 
    for value in data: 
     print("trying", value) 
     if n == value: 
      print("Found") 
      return True 
    print("Giving up") 
    return False 

print(dataset([1,5,8,3], 3)) 
print(dataset([1,5,8,3],-1)) 

你可以看到它會嘗試每一個項目,因爲它輸出這樣的:

('checking', [1, 5, 8, 3], 3) 
('trying', 1) 
('trying', 5) 
('trying', 8) 
('trying', 3) 
Found 
True 
('checking', [1, 5, 8, 3], -1) 
('trying', 1) 
('trying', 5) 
('trying', 8) 
('trying', 3) 
Giving up 
False 

而第一個代碼只嘗試的第一個項目:

def dataset(data,n): 
    print("checking", data, n) 
    for value in data: 
     print("trying", value) 
     if n == value: 
      print("Found") 
      return True 
     else: 
      print("Giving up") 
      return False 

print(dataset([1,5,8,3], 3)) 
print(dataset([1,5,8,3],-1)) 

,輸出:

('checking', [1, 5, 8, 3], 3) 
('trying', 1) 
Giving up 
False 
('checking', [1, 5, 8, 3], -1) 
('trying', 1) 
Giving up 
False 
1

當您有else: return false時,只要遇到非n的元素,程序就會返回False。 但是,如果將它放在函數末尾,則只有當以前執行的語句​​都不爲真時纔會執行語句return False,因爲該函數將不再在return語句後執行。如果n == data中沒有一個爲真,則表示n不在數據中。

2

在第一種情況下,您要遍歷列表,然後根據第一個項是否與輸入值匹配返回True或False。由於在你的數據中第一個元素永遠不匹配輸入,都返回False。

在第二種情況下,只有當任何列表項與輸入匹配時,函數纔會返回。循環遍歷所有元素,直到匹配。如果不是,則返回False。

2

我知道這個問題已經回答了,但因爲你是新來的Python我想我給你一點點額外的:-)

def dataset(data,n): 
    return n in data 

這將工作。它只是檢查是否n是在列表與否,再返回TrueFalse

+1

哇!這是一個巧妙的把戲。謝謝!! – Chua

-1

這個循環

for value in data: 
    if n == value: 
     return True 
    else: 
     return False 

在邏輯上等同於這一行

return n == data[0] 

換句話說,你」已在第一個元素後返回並退出循環/函數

您的其他解決方案在邏輯上等同於return n in datareturn any(n == x for x in data)將遍歷整個列表,並在所有值被檢查後爲您提供值。 (不過,我認爲這兩種選擇會在存在匹配時短路)

相關問題