2017-05-29 78 views
0

在第二個返回語句(返回False)的縮進級別正好在循環之下的教程之後,因此在循環之外。 不應該在for循環中嗎?Python返回語句縮進級別

import scrabble 
letters = "abcdefghijklmnoprstuvwxyz" 

def has_a_double(letter): 
    for word in scrabble.wordlist: 
    if letter + letter in word: 
     return True 
    return False 

for letter in letters: 
    if not has_a_double(letter): 
    print(letter + " never appears doubled") 

我還有一個片段,其中相同的縮進水平導致不正確的輸出:

#word_list = ["one", "two", "four"] 
#word_list = ["three", "five", "six", "seven", "nine"] 
word_list = ["one", "two", "three", "five", "four"] 
#word_list = ["one", "two", "three", "five"] 
def has_o_in_it(words): 
    for word in words: 
    if "o" not in word: 
     return False 
    return True 

if has_o_in_it(word_list): 
    print("word list has o in it") 
else: 
    print("word list has no o in it") 

當我運行上面的代碼,結果是「單詞列表中有沒有O」 爲什麼不把回報聲明全部在條件檢查下?

+5

爲什麼你認爲它應該在循環內?它會在第一次迭代時結束循環,* always *。 –

+0

換句話說,通過** not **將其放置在循環中,只有在循環中的所有項目都被檢查後才返回'False'。你認爲更正確的是什麼? –

+0

我會假設教程沒有提到'any()'函數? –

回答

1

所以,讓我們通過has_o_in_it(words)邏輯:

  1. 有多個單詞,所以我們需要遍歷他們:for word in words:
  2. 每個字,我們需要檢查它是否包含「O」:if "o" in word:
    1. 如果字中的「o」我們所知道的名單呢:return True
    2. 如果字做esn't含有「O」我們需要不斷檢查:continue
  3. 如果我們通過整個名單沒有得到我們returning True可以得出結論:在列表中不包含「O」:return False

因此,代碼應該是這樣的:

def has_o_in_it(words): 
    for word in words: 
     if "o" in word: 
      return True 
     else: 
      continue 
    return False 

還有其他的(更簡潔的方式)來寫這個代碼,以及(第一個是最好的):

# Uses a list comprehension and the any (https://docs.python.org/3/library/functions.html#any) keyword. 
def has_o_in_it(words): 
    return any("o" in word for word in words) 

# Filters the array for only word with o, converts to list and then to 
boolean (empty lists == False). 
def has_o_in_it_(words): 
    return bool(list(filter(lambda x: "o" in x, words))) 
1

我有另一個片段,其中相同的縮進級別導致不正確的輸出

輸出只是不正確,因爲邏輯有缺陷。

自己跳過列表。它會立即返回False,並聲稱沒有任何詞語包含o。

你不應該在循環中有回報。你可以保持它的軌道,而不是假設你想看到的所有元素

def has_o_in_it(words): 
    seen = False 
    for word in words: 
    if "o" in word: 
     seen = True 
    return seen 

然而,這是非常冗長,可能寧可

return any(lambda word: 'o' in word, words) 

或者

return 'o' in ''.join(words)