Python如何用精简代码统计字符串大小写字母 修复第二版代码运行异常
问题描述
开发中需要实现如下字符串处理逻辑:
- 统计目标字符串中的大写字母、小写字母数量
- 比对两类字符的计数:如果大写字母数量更多,将字符串全转为大写输出;否则全转为小写输出
第一版代码可以正常运行,但写法冗余杂乱,因此重构了第二版更精简的实现,但第二版运行不符合预期:即使大写字母数量更多,程序也始终输出小写形式的字符串。
相关代码
可正常运行的第一版实现
str1="HEY tHeRE Whats UP" upper1,lower1=0,0 for i in range(len(str1)): if str1[i].isupper(): upper1+=1 if str1[i].islower(): lower1+=1 if upper1>lower1: print(str1.upper()) else: print(str1.lower())
运行异常的第二版精简实现
def count_up_and_low(word): u = [x for x in word if x.isupper()] l = [x for x in word if x.islower()] return len(u),len(l) word="HEY THERE WHATS up" count_up_and_low(word) if u>l: print(word.upper()) else: print(word.lower())
故障原因
第二版代码的核心问题是变量作用域错误+未接收函数返回值:
- 函数
count_up_and_low内部定义的u、l是局部变量,仅能在函数内部访问,全局作用域下无法直接读取这两个变量。 - 调用
count_up_and_low(word)时,虽然函数计算并返回了大写、小写字母的长度值,但代码没有用变量接收这两个返回值,后续判断逻辑里用到的u、l根本不是函数计算出的计数结果。
如果是在普通脚本环境运行这段代码,本应直接抛出NameError: name 'u' is not defined的报错;你遇到始终输出小写的情况,大概率是在交互式解释器中运行,之前执行的其他代码给全局作用域的u、l赋过值,且值满足u <= l,因此始终走到输出小写的分支。
修复方案
调用计数函数时,用两个变量接收返回的长度值,再做大小比对即可,修复后的代码如下:
def count_up_and_low(word): u = [x for x in word if x.isupper()] l = [x for x in word if x.islower()] return len(u),len(l) word="HEY THERE WHATS up" u, l = count_up_and_low(word) # 接收函数返回的两个计数值 if u>l: print(word.upper()) else: print(word.lower())
内容的提问来源于stack exchange,提问作者user15330159
相关产品推荐
相关产品推荐

