You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())
故障原因

第二版代码的核心问题是变量作用域错误+未接收函数返回值:

  1. 函数count_up_and_low内部定义的u、l是局部变量,仅能在函数内部访问,全局作用域下无法直接读取这两个变量。
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:12:35