如何解决Python报错TypeError: vowels()缺少必填位置参数'filehandle'
直接报错原因
你定义的vowels函数声明时要求必须传入filehandle参数,但是你在main函数里第一行就调用vowels(),没有传入任何参数,就会触发这个参数缺失的报错。
除此之外你的代码还有多处逻辑和顺序错误,下面逐一梳理:
其他问题梳理
- 执行顺序颠倒:统计文件内容的函数必须在打开文件拿到文件对象之后才能调用,你现在是先调用统计函数,再打开文件,逻辑完全反过来了
- 变量和函数重名:你把
vowels函数的返回值存在名为vowel的变量没问题,但存辅音的变量直接叫consonants,和函数名完全一致,会直接覆盖原函数,后续没法再调用这个函数 - 文件读取逻辑错误:直接遍历
filehandle得到的是每一行的文本,不是单个字符,没法直接判断单个字符的类型;另外你让用户输入了文件名,但是打开文件时写死了words.txt,用户输入的内容完全没用 - 作用域问题:辅音统计函数里用到的
vowels元音列表是定义在vowels函数内部的,外部函数访问不到,会触发未定义报错 - 拼写错误:大小写统计函数里
lowecase拼写错误,正确应为lowercase - 大小写统计逻辑写反:你判断字符是小写a-z的时候给
uppercase计数,判断是大写A-Z的时候给lowercase计数,统计结果会完全反过来
修正后完整代码
# 把元音列表提出来作为全局常量,所有函数都能调用 VOWELS = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'} def count_vowels(content): num_vowel = 0 for c in content: if c in VOWELS: num_vowel += 1 return num_vowel def count_consonants(content): num_con = 0 for c in content: # 先判断是不是字母 if c.isalpha(): # 是字母且不在元音列表里就是辅音 if c not in VOWELS: num_con +=1 return num_con def count_case(content): uppercase = 0 lowercase = 0 for c in content: if c.islower(): lowercase +=1 elif c.isupper(): uppercase +=1 return uppercase, lowercase def main(): try: # 先获取文件名,打开文件读取全部内容 filename = input('Enter name of text file: ') with open(filename, 'r', encoding='utf-8') as f: content = f.read() # 读取到内容后再调用各个统计函数 vowel_count = count_vowels(content) consonant_count = count_consonants(content) upper_count, lower_count = count_case(content) # 打印结果 print('Vowels:', vowel_count) print('Consonants:', consonant_count) print('Uppercase:', upper_count) print('Lowercase:', lower_count) except IOError: print('FILE NOT FOUND') if __name__ == "__main__": main()
修正说明
- 把元音列表提为全局常量,避免不同函数重复定义
- 统一先读取文件全部内容为字符串再传入统计函数,避免多次遍历文件对象导致的读空问题
- 用Python内置的
isalpha()、islower()、isupper()方法判断字符类型,比手动比对ASCII码更简洁不易出错 - 用
with语法打开文件,不需要手动写close()关闭文件,会自动处理 - 所有统计函数的命名和返回值存储的变量名做了区分,不会出现覆盖函数的问题
内容的提问来源于stack exchange,提问作者BeanBagels
相关产品推荐
相关产品推荐

