使用接受字符串作为参数的函数编写程序,并返回字符串包含的元音数。应用程序应该有另一个接受字符串作为参数的函数,并返回字符串包含的辅音数。应用程序应该让用户输入一个字符串,并且应该显示元音的数量和它包含的辅音数量。
这是我到目前为止的代码:
def main():
mystr = input('Please enter a string: ')
mystr.lower()
index = 0
vowelSet = set(['a','e','i','o','u'])
vowels = 0
consonants = 0
def runVowels(mystr):
while index < len(mystr):
if mystr[index] in vowels:
vowels += 1
index += 1
print('This string consists of ' + mystr(vowels) + 'vowels')
def runConsonants(mystr):
while index < len(mystr):
if mystr[index] != vowels:
consonants += 1
index += 1
print('This string consists of ' + mystr(consonants) + 'consonants')
main()
我在哪里出错并且我是在正确的轨道上?
答案 0 :(得分:6)
你在这里遇到了很多问题。
在定义名为myVowels
和myConsonants
的函数时,您永远不会调用它们。您可能希望在main
函数结束时执行此操作。
在main
内,mystr.lower()
没有做任何有用的事情。该函数返回一个新字符串,全部小写等效于mystr
,但您不能将其存储在任何位置。将其存储在某处(无论是回到mystr
,还是存储到新变量中),以便您可以使用它。
在runVowels
内,index += 1
位于if
声明中。所以,一旦你找到一个辅音,你就会越过if
,错过递增index
,然后一遍又一遍地绕过同一个辅音。 Dedent那条线。 (你在runConsonants
中再次遇到同样的错误,对于以下所有错误也是如此。)
在runVowels
内,print
来自while
语句,因此它会为每个字母打印一次运行总计,而不是仅打印总计结束。再一次,dedent one line。
您在index
中创建了名为vowels
,vowelsSet
和main
的变量,这意味着它们是该函数的本地变量。然后,您可以在runVowels
中访问那些名称不存在的变量。每个函数都有自己的本地名称空间。将这些作业从main
移至runVowels
- 或将其传递到runVowels
,与使用mystr
的方式相同。
您创建名为vowels
和vowelsSet
的变量,但之后您尝试访问它们,就好像它们都被称为vowels
一样。保持正确,使用正确的名称为正确的值。
我不确定mystr(vowels)
应该做什么。你不能像函数一样调用字符串。我想你想要内置的str
函数。 (但是,您可能希望查看字符串格式,或者只是查看将多个参数传递给print
时会发生什么;您很少需要按照自己的方式连接字符串。)
我不保证修复所有这些问题会使您的代码按照您的意愿行事 - 这当然是必要的,但可能还不够。
然而,希望了解每个问题的错误应该有助于你学习如何自己发现类似的问题(而不是如何避免它们 - 除非你是历史上最伟大的天才,否则你会写这样的错误直到你死的那一天,你会更好地测试,调试和修复它们。)
答案 1 :(得分:0)
你越来越近了。你的循环中仍然有神秘的mystr.lower()
。你应该把它从循环中取出来,你需要保存它返回的结果(mystr的小写版本),
例如mystr = mystr.lower()
。
我建议你在main()中执行此操作,然后将小写版本传递给计数函数。
一旦你这样做,runVowels()几乎是完美的。 runConsonants()仍然需要更多的工作。如果一个角色不是元音并不意味着它必然是一个辅音 - 它可以是数字,标点符号或空格。
如果你的函数中的循环遍历字符串本身,那么它将更加Pythonic,你不需要索引的东西。在解释器中查看:
mystr = "This is a TEST string"
for letter in mystr:
print(letter)
此外,问题还指出每个计数功能都应该返回一个数字。所以runVowels()和runConsonants()应该将它们的计数返回给main()并让它来处理打印。
答案 2 :(得分:0)
以下代码在python 2.7.3上进行了测试。
您需要研究变量范围,您不能在一个方法中定义变量并在另一个方法中使用它。
稍微研究一下从用户那里获取输入的最佳方式,sys是一个非常好的库
始终,在使用变量之前始终初始化变量,并提供内联注释。
def main():
mystr = raw_input("Enter your String:")
mystr.lower()
#index = 0, index is useless here
vowelSet = set(['a','e','i','o','u'])
#vowels = 0, vowels is useless here
#consonants = 0, consonants is useless here
#Either pass vowelSet as argument or define them explicitly in the methods
runVowels(mystr, vowelSet)
runConsonants(mystr, vowelSet)
def runVowels(mystr, vowelSet):
#index, vowels needs to be defined and assigned a default value here
index = 0
vowels = 0
while index < len(mystr):
if mystr[index] in vowelSet:
vowels += 1
# You need to increment index outside of the condition
index += 1
print 'This string consists of ', vowels , 'vowels'
def runConsonants(mystr, vowelSet):
#index, consonants needs to be defined and assigned a default value here
index = 0
consonants = 0
while index < len(mystr):
if mystr[index] not in vowelSet:
consonants += 1
# You need to increment index outside of the condition
index += 1
print 'This string consists of ' , consonants , 'consonants'
main()
示例运行:
$ python vow.py
Enter your String:aeeiithy
This string consists of 5 vowels
This string consists of 3 consonants
同样,该程序仅打印元音的数量。如果你需要多个不同的&#39;元音,它会有点不同。 希望这可以帮助 !
答案 3 :(得分:0)
请勿将此示例转换为您的课程; - )
检查它可能会帮助你让你的工作。
def charCounts(mystr):
mystr = mystr.strip().lower()
vowels = 0
cons = 0
for c in mystr:
if c in 'aeiou':
vowels += 1
elif c >= 'a' and c <= 'z':
cons += 1
return vowels, cons
if __name__ == '__main__':
mystr = input('Please enter a string: ')
vowels, cons = charCounts(mystr)
print('This string consists of {0} vowels and {1} consonants'.format(vowels, cons))