遵循教程,其中第二个返回语句的压痕级别(返回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)
的逻辑:
- 有多个单词,所以我们需要迭代它们:
for word in words:
- 对于每个 Word我们需要检查它是否包含'o':
if "o" in word:
- 如果单词包含" o",我们知道列表确实:
return True
- 如果Word不包含" 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)))
我有另一个片段,其中相同的压痕级别导致不正确的输出
由于逻辑有缺陷,输出仅是不正确的。
自己跨越清单。它将立即以三个返回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)