
本文介绍一种简洁、易懂的纯 Python 方法,通过遍历字符逐个判断大小写,将驼峰式字符串(如 camelCaseString)转换为下划线分隔的小写格式(如 camel_case_string),全程无需正则表达式或内置分割函数。
本文介绍一种简洁、易懂的纯 python 方法,通过遍历字符逐个判断大小写,将驼峰式字符串(如 `camelcasestring`)转换为下划线分隔的小写格式(如 `camel_case_string`),全程无需正则表达式或内置分割函数。
在初学 Python 时,常会遇到将驼峰命名(CamelCase)转换为蛇形命名(snake_case)的需求。例如,将 "userLoginCount" 转为 "user_login_count"。虽然正则表达式(如 re.sub(r'(?不使用正则、不调用高级函数(如 re.split 或 itertools.groupby)时。
核心思路是:逐个检查每个字符,若为大写字母,则在其前插入下划线,并将该字母转为小写;其余字符直接保留。注意:首个字母即使大写也不应在前面加下划线(避免生成 _first_name),因此我们统一在「遇到大写字母且非首字符」时才添加 _。
以下是推荐的实现方式:
word = input("What is the camelCase? ")
result = ""
for i, char in enumerate(word):
if char.isupper():
if i == 0:
result += char.lower() # 首字母大写 → 小写,不加下划线
else:
result += "_" + char.lower() # 非首字母大写 → 前加_,自身变小写
else:
result += char # 小写字母或数字等直接追加
print(result)✅ 运行示例:
输入:XMLHttpRequest
输出:xml_http_request
输入:iPhone
输出:i_phone
输入:SimpleHTTPServer
输出:simple_http_server
⚠️ 关键注意事项:
- 原问题中 for i, k in word: 是错误用法:word 是字符串,迭代时每次只产出一个字符(如 'c'),无法解包为两个变量(i, k),故报错 not enough values to unpack;
- for i and k in word: 语法非法,i and k 是布尔表达式,不能用于 for 的目标变量,导致 cannot assign to expression;
- .lower 是方法对象,未加括号 () 不会执行,写作 i.lower + k 会引发 TypeError(不可拼接方法与字符串);
- 本方案使用 enumerate() 获取索引,精准控制是否在首字符前添加下划线,比单纯拼接更鲁棒;
- 若需兼容数字或特殊字符(如 get2ndItem → get2nd_item),当前逻辑已天然支持,因 char.isupper() 对非字母返回 False,不会误处理。
? 进阶提示(可选优化):
若希望更 Pythonic,可用列表推导式+join替代字符串拼接(避免频繁创建新字符串):
chars = []
for i, c in enumerate(word):
if c.isupper():
chars.append('_' + c.lower() if i else c.lower())
else:
chars.append(c)
print(''.join(chars))掌握这种基于字符遍历与条件判断的思维,不仅适用于命名转换,也是解析协议、处理文本格式、实现简易词法分析器的重要基础。










