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)
的逻辑:
- 有多个词,所以我们需要迭代它们:
for word in words:
- 对于每个字我们需要检查它是否包含'o':
if "o" in word:
- 如果单词包含 "o" 我们知道列表确实:
return True
- 如果单词不包含 "o" 我们需要继续检查:
continue
- 如果我们在没有
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)
遵循教程,其中第二个 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)
的逻辑:
- 有多个词,所以我们需要迭代它们:
for word in words:
- 对于每个字我们需要检查它是否包含'o':
if "o" in word:
- 如果单词包含 "o" 我们知道列表确实:
return True
- 如果单词不包含 "o" 我们需要继续检查:
continue
- 如果单词包含 "o" 我们知道列表确实:
- 如果我们在没有
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)