Python中不使用.upper()方法实现字符串转大写及代码排查
代码存在的问题
- 参数读取逻辑错误:循环读取命令行参数时,直接将整个参数列表
sys.argv赋值给seq,没有按索引取对应位置的参数,同时把脚本自身文件名(sys.argv[0])也加入了待处理列表。 - 返回值未接收:调用
uppercase函数后没有保存返回的转换结果,最后打印的是未处理的原始参数列表,无法得到转换后的内容。 - 字符匹配逻辑有缺陷:遍历字母表查找字符位置时,未对非字母字符做前置判断,会触发变量
i未定义的报错;找到匹配字符后没有终止内层循环,存在无意义的性能损耗。
修复实现(无
.upper()调用) 通过ASCII码差值转换的方式实现效率更高,小写字母a-z的ASCII码范围为97-122,对应大写字母A-Z的ASCII码范围为65-90,二者固定差值为32,小写字符减32即可得到对应大写字符:
import sys def uppercase(seq): result = '' for char in seq: char_code = ord(char) # 判断是否为小写字母,是则转大写 if 97 <= char_code <= 122: result += chr(char_code - 32) else: # 大写字母、其他字符直接保留 result += char return result if __name__ == "__main__": processed_seqs = [] # 从索引1开始读取传入的序列参数,跳过索引0的脚本文件名 for idx in range(1, len(sys.argv)): processed_seqs.append(uppercase(sys.argv[idx])) print(processed_seqs)
传入测试输入AgtGtGcC、AAtcccgG运行,输出结果为['AGTGTGCC', 'AATCCCGG'],符合转大写的预期。
如果要沿用原本的字母表映射思路,可使用更简洁的映射写法,避免多层循环:
def uppercase(seq): lower_chars = 'abcdefghijklmnopqrstuvwxyz' upper_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' result = '' for char in seq: if char in lower_chars: result += upper_chars[lower_chars.index(char)] else: result += char return result
内容的提问来源于stack exchange,提问作者Karoline Busche
相关产品推荐
相关产品推荐

