Python字符串处理函数中if语句修改未全部生效该如何修复?
问题根因
sentence_maker函数中每个逻辑判断分支都加了return语句,只要触发任意一个判断就会直接终止函数返回结果,后续的处理逻辑完全不会执行。你单独测试每个规则时,测试用例仅触发单个判断分支,所以看起来运行正常,但当输入需要多个规则同时处理时,提前return就会导致后续规则不生效,这就是只有首字母大写功能正常的核心原因。- 若输入的字符串刚好满足所有前置判断的反向条件(比如已经首字母大写、结尾已经是
./!),函数不会走到任何一个return分支,最终默认返回None,也就是你之前遇到的列表中存在NoneType元素的问题。 - 疑问句判断逻辑放在了所有规则最后,顺序不合理,就算前面的分支没有提前返回,也会先把结尾符号改成普通句的标点,再替换成问号,增加了不必要的处理步骤。
修复代码
调整逻辑执行顺序,所有修改先在临时变量上更新,全部规则处理完成后再统一返回结果:
def sentence_maker(phrase): question_indicators = ('What', 'Where', 'When', 'Why', 'Which', 'Who', 'Whose', 'How', 'Is', 'Does') # 第一步:处理首字母大写 processed = phrase[0].upper() + phrase[1:] if phrase[0].islower() else phrase # 第二步:替换结尾错误的逗号、冗余问号为句号 if processed[-1] in [',', '?']: processed = processed[:-1] + '.' # 第三步:无结束标点的句子补充句号 if processed[-1] not in ['.','!']: processed = processed + '.' # 第四步:判断为疑问句的统一替换结尾为问号 if processed.startswith(question_indicators): processed = processed[:-1] + '?' # 统一返回处理结果,避免出现None return processed results = [] while True: phrase = input('Enter your text here, good sir: ') # 注意转义匹配用户输入的\end if phrase == '\\end': break results.append(sentence_maker(phrase)) print(results)
内容的提问来源于stack exchange,提问作者RoarAgainstTheModernWorld
相关产品推荐
相关产品推荐

