Python return 语句缩进级别

Python return statement indentation level

遵循教程,其中第二个 return 语句的缩进级别 (return False) 位于 for 循环的正下方,因此在循环之外。 不应该在for循环里面吗?

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")

当我 运行 以上片段时,结果是 "word list has no o in it" 为什么不将 return 语句全部置于条件检查之下?

那么让我们来看看has_o_in_it(words)的逻辑:

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

I have another snippet where same indentation level results in incorrect output

输出不正确只是因为逻辑有问题。

自己跨过列表。它会在三点时立即 return False 并声称没有单词包含 o。

循环中不应包含 return。您可以跟踪它,而不是假设您想要查看所有元素

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)