Python返回声明缩进级别



遵循教程,其中第二个返回语句的压痕级别(返回false(在循环下方,因此在循环之外。它不应该在循环内吗?

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"为什么不将所有返回语句放在有条件的检查下?

所以让我们浏览 has_o_in_it(words)的逻辑:

  1. 有多个单词,所以我们需要迭代它们:for word in words:
  2. 对于每个 Word我们需要检查它是否包含'o': if "o" in word:
    1. 如果单词包含" o",我们知道列表确实: return True
    2. 如果Word不包含" 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)))

我有另一个片段,其中相同的压痕级别导致不正确的输出

由于逻辑有缺陷,输出仅是不正确的。

自己跨越清单。它将立即以三个返回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) 

最新更新