【问题标题】:For Loop in a Function for Counting Vowels in a User Inputted String用于计算用户输入字符串中元音的函数中的 For 循环
【发布时间】:2018-03-01 00:21:17
【问题描述】:

我试图在一个函数中运行一个 for 循环,该函数旨在计算用户输入字符串中的元音。但是,错误“builtins:TypeError”不断出现。我尝试过简单地使用字符串的长度,使用 len 函数,但是错误根本不会消失,并且代码最终因此而被破坏。有针对这个的解决方法吗? Screenshot of the code with the error message showing

例如,我首先要求用户输入一个字符串。然后应该使用在 print 语句中调用的函数来计算用户输入字符串中的元音。目前,当键入一个字符串时,例如 Kay,它会在第 6 行产生一个错误代码,指出“for char in (string):”,这是 for 循环的开始。此循环的目的是确保在代码退出之前检查所有字母的元音。有一个适当的缩进,表明没有错误以及计算机科学和编程的原则。用户输入部分,声明“string= input(”请输入一个短语。“)”定义了变量字符串,并位于代码的顶部。

【问题讨论】:

标签: python python-3.x function for-loop


【解决方案1】:

这是您的代码的修改版本。

mystr = input('Please enter a phrase:\n')

def countvowels(x):
    counter = 0
    for i in x.lower():
        if i in set('aeiou'):
            counter += 1
    return counter

print(countvowels(mystr))

说明

  • 不要在类或内置函数之后命名变量,例如使用counter 而不是sum
  • 使用x.lower()。注意后面的括号,表示您希望函数执行。
  • set('aeiou') 创建一组元音,即{'a', 'e', 'i', 'o', 'u'}。检查一个变量是否有效,复杂度为 O(1)。
  • input() 默认返回一个字符串,因此无需手动转换为str

【讨论】:

  • 请注意count 一个类方法。
  • @Prune,好点子,虽然这与我提到类名的观点不冲突:)。也就是说,我会重命名它。
【解决方案2】:

string.lower 更改为string.lower()string.lower 引用函数。将字母放在引号中。您没有定义这些变量。

函数的更好版本:

def countvowels(x):
    return sum([1 for a in x if a in "AEIOUaeiou"])

【讨论】:

    【解决方案3】:

    我想你想在这里使用“in”:

    string = raw_input('Please enter a phrase. ')
    def countvowels(string):
      string = str(string).lower()
      sum = 0
      for char in string:
        if char in ('a', 'e', 'i', 'o', 'u'):
          sum += 1
      print(sum)
      return sum
    
    
    countvowels(string)
    

    【讨论】:

      【解决方案4】:

      你有两个问题。

      首先,lower 是一个函数,你必须在它后面加上括号来调用它。

      string = string.lower()
      

      您的代码只是将string 设置为函数本身,而不是运行它并使用结果。

      其次,当你测试字符是否是元音时,你需要在它们周围加上引号。否则,您将尝试使用您从未定义的名为 ae 等的变量。

      if char == 'a' or char == 'e' or char == 'i' or char == 'o' or char == 'u':
      

      您还可以将其简化为:

      if char in 'aeiou':
      

      【讨论】:

        【解决方案5】:

        我自己的旋转。使用更有效的集合。如果您要解析整本书,这很有用

        from collections import Counter
        
        user_input = input("Please enter a string: ")
        
        # counter occurances of each letter
        counter = Counter(user_input)
        
        # drop non vowels
        vowels_only = {k : v for k, v in counter.items() if k in "aeiou"}
        
        # sum
        vowels_total = sum(vowels_only.values())
        
        print("Total vowels:", vowels_total)
        

        快速解决方案

        这是一个简单但非 Python 式(混乱)的解决方案

        user_input = input("Please enter a string: ")
        
        # filter out everything that isn't a vowel, then count the len of what's left
        vowel_count = len(list(filter(lambda x: x in "aeiou", list(user_input))))
        
        print(vowel_count)
        

        【讨论】:

          【解决方案6】:

          使用正则表达式

          import re
          
          mystrings = input("Please enter a string: ")
          
          vowels = [len(re.findall('a|e|i|o|u', x.lower())) for x in mystrings]
          
          print sum(vowels)
          

          【讨论】:

            【解决方案7】:
            sum(userString.count(c) for c in 'aeiouAEIOU')
            

            作为一个字符串,userString 有它自己的 'count' 方法。不过不确定这是否性能更好。

            【讨论】:

              猜你喜欢
              • 2020-02-19
              • 2020-01-28
              • 1970-01-01
              • 2021-06-26
              • 2022-01-03
              • 1970-01-01
              • 1970-01-01
              • 2011-12-29
              • 2019-11-26
              相关资源
              最近更新 更多