2017-05-29 20 views
0

2番目のreturn文のインデントレベル(return False)は、forループのすぐ下にあり、ループの外側です。 forループの中に置かなければなりませんか?Pythonのreturn文インデントレベル

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

可能性がありますが、すべての要素

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

を見たいと思っていると仮定し、それを追跡することができそれはループ内にあるべきだと思いますか?最初の反復でループを終了します。* always *。 –

+0

言い換えれば、**ループに置かないで**ループ内のすべての項目が検査された後にのみ '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. 単語を行う場合我々はチェックを維持する必要があり、「O」esn't含まれています。私たちはreturning Trueずにリスト全体を取得する場合continue
  3. は、我々はリストには、「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

同じインデントレベルで出力が正しくない別のスニペットが表示される

ロジックに欠陥があるため、出力に誤りがあります。

自分でリストを上書きします。それはすぐに3時にFalseを返し、oを含んでいる単語はないと主張します。

ループ内でリターンする必要はありません。そして、あなたはその代わりしかし、それは非常に冗長だし、やるのはなぜむしろ

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

それとも

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