请更正我的循环以检查字符串是否包含元音 (Python)?
Please correct my loop to check if a string contains vowels (Python)?
我输入以下内容来检查字符串是否包含元音字母,但似乎有问题,因为它报告整个单词的第一个字母是非元音字母。
我该怎么办?
def vowel(s):
s = str(s)
s = s.lower()
vowel = ("a", "e", "i", "o", "u")
for char in s:
if char in vowel:
print("Yes,", s, "contains a vowel.")
break
else:
print("No,", s, "has no vowels contained.")
break
vowel("apple")
vowel("shh")
循环 breaks
在第一个字符上无论如何。如果第一个字符是元音,你可以说这个词有元音,但在你到达结尾之前你不能说它没有。 Python 有一个专门为此目的而设计的简洁结构:for
-loop else
子句。只有在没有中断的情况下到达循环末尾时才会触发。
所以您可以通过删除 8 个空格和一个 break
.
来修复您的代码
def vowel(s):
s = str(s)
s = s.lower()
vowel = ("a", "e", "i", "o", "u")
for char in s:
if char in vowel:
print("Yes,", s, "contains a vowel.")
break
else:
print("No,", s, "has no vowels contained.")
vowel("apple")
vowel("shh")
要对此进行优化,除了运算符 in
之外,还可以考虑使用内置函数 any
。您可以将 vowel
写为单个字符串并直接检查其中是否包含:
if any(char in 'aeiou' for char in s):
print("Yes,", s, "contains a vowel.")
else:
print("No,", s, "contains no vowels.")
您甚至可以将条件重写为
any(map('aeiou'.__contains__ s))
对于包含检查,使用 set
来实现 O(1)
查找通常更有效,但是元音序列太小了我怀疑只使用str.__contains__
.
的默认线性搜索
对于一些非常罕见的情况,比如少于 5 个字符的字符串,您可以撤销检查:
any(map(s.__contains__, 'aeiou'))
def vowel(s):
s = str(s)
s = s.lower()
vowels = ("a", "e", "i", "o", "u")
for vowel in vowels:
if vowel in s:
print("Yes,", s, "contains a vowel.")
return True
print("No,", s, "does not contain a vowel.")
return False
这将是一种方法。一旦找到元音,函数 returns True 就会停止搜索。如果未找到元音字母,则循环终止并打印 'No' 语句。
与其在 for-loop
中使用 if-else
,不如使用 if
来检查是否找到元音。如果找到元音,则从函数中打印“found”和 return
。如果未找到元音,则表示 for-loop
已结束,然后您可以打印“未找到”:
def vowel(s):
s = str(s)
s = s.lower()
vowel = ["a", "e", "i", "o", "u"]
for char in s:
if char in vowel:
print("Yes,", s, "contains a vowel.")
return
print("No,", s, "has no vowels contained.")
如果你想计算每个元音有多少个,你可以使用字典:
vowel = {"a":0, "e":0, "i":0, "o":0, "u":0}
我输入以下内容来检查字符串是否包含元音字母,但似乎有问题,因为它报告整个单词的第一个字母是非元音字母。
我该怎么办?
def vowel(s):
s = str(s)
s = s.lower()
vowel = ("a", "e", "i", "o", "u")
for char in s:
if char in vowel:
print("Yes,", s, "contains a vowel.")
break
else:
print("No,", s, "has no vowels contained.")
break
vowel("apple")
vowel("shh")
循环 breaks
在第一个字符上无论如何。如果第一个字符是元音,你可以说这个词有元音,但在你到达结尾之前你不能说它没有。 Python 有一个专门为此目的而设计的简洁结构:for
-loop else
子句。只有在没有中断的情况下到达循环末尾时才会触发。
所以您可以通过删除 8 个空格和一个 break
.
def vowel(s):
s = str(s)
s = s.lower()
vowel = ("a", "e", "i", "o", "u")
for char in s:
if char in vowel:
print("Yes,", s, "contains a vowel.")
break
else:
print("No,", s, "has no vowels contained.")
vowel("apple")
vowel("shh")
要对此进行优化,除了运算符 in
之外,还可以考虑使用内置函数 any
。您可以将 vowel
写为单个字符串并直接检查其中是否包含:
if any(char in 'aeiou' for char in s):
print("Yes,", s, "contains a vowel.")
else:
print("No,", s, "contains no vowels.")
您甚至可以将条件重写为
any(map('aeiou'.__contains__ s))
对于包含检查,使用 set
来实现 O(1)
查找通常更有效,但是元音序列太小了我怀疑只使用str.__contains__
.
对于一些非常罕见的情况,比如少于 5 个字符的字符串,您可以撤销检查:
any(map(s.__contains__, 'aeiou'))
def vowel(s):
s = str(s)
s = s.lower()
vowels = ("a", "e", "i", "o", "u")
for vowel in vowels:
if vowel in s:
print("Yes,", s, "contains a vowel.")
return True
print("No,", s, "does not contain a vowel.")
return False
这将是一种方法。一旦找到元音,函数 returns True 就会停止搜索。如果未找到元音字母,则循环终止并打印 'No' 语句。
与其在 for-loop
中使用 if-else
,不如使用 if
来检查是否找到元音。如果找到元音,则从函数中打印“found”和 return
。如果未找到元音,则表示 for-loop
已结束,然后您可以打印“未找到”:
def vowel(s):
s = str(s)
s = s.lower()
vowel = ["a", "e", "i", "o", "u"]
for char in s:
if char in vowel:
print("Yes,", s, "contains a vowel.")
return
print("No,", s, "has no vowels contained.")
如果你想计算每个元音有多少个,你可以使用字典:
vowel = {"a":0, "e":0, "i":0, "o":0, "u":0}