Python自定义分割函数问题:小数部分最后一位无法正确存入?
问题分析与修复:分割数字的整数和小数部分
问题描述
我是Python编程新手,目前有课堂作业需要完成:编写一个无需切片或其他内置函数的程序,将数字(如12.5)分割为整数部分(12)和小数部分(5)。我编写了如下decoupage函数,但该函数仅能正确处理整数部分,小数部分的最后一位无法存入对应变量。逐行调试后发现,整数部分12能正确存入partie_entiere,但小数部分的5无法存入partie_decimale,请问这是什么原因?
原代码:
def decoupage(nombre:str)->(str,str): partie_entiere = '' partie_decimale = '' delimiteurs = [',','.'] compte = 0 for lettre in nombre: if lettre not in delimiteurs: if compte != 1: partie_entiere += lettre elif compte == 1: partie_decimale += lettre else: compte += 1 return partie_entiere, partie_decimale assert decoupage("12.5") == ('12', '5') assert decoupage("12,5") == ('12', '5') assert decoupage("0.5") == ('0', '5') assert decoupage("12") == ('12', '0')
问题原因
你的代码逻辑存在两处关键漏洞:
- 当遇到分隔符(
.或,)时,compte会被设为1,标记进入小数部分处理阶段,但接下来的小数位字符(比如示例中的5)不属于分隔符,会进入第一个if分支,此时compte == 1,导致if compte !=1条件不成立,既不会把字符加到整数部分,也没有逻辑把它加到小数部分,最终小数位字符被直接忽略 - 原代码未处理无小数部分的情况,此时
partie_decimale会是空字符串,无法满足('12', '0')的断言要求
修复后的代码
调整逻辑,在非分隔符分支里根据compte的值决定添加到整数还是小数部分,同时处理无小数部分的情况:
def decoupage(nombre: str) -> (str, str): partie_entiere = '' partie_decimale = '' delimiteurs = [',', '.'] compte = 0 # 0表示处理整数部分,1表示处理小数部分 for lettre in nombre: if lettre not in delimiteurs: if compte == 0: partie_entiere += lettre else: partie_decimale += lettre else: # 遇到分隔符,仅在当前处于整数部分时切换状态 if compte == 0: compte = 1 # 无小数部分时,返回'0'而非空字符串 if not partie_decimale: partie_decimale = '0' return partie_entiere, partie_decimale # 验证断言 assert decoupage("12.5") == ('12', '5') assert decoupage("12,5") == ('12', '5') assert decoupage("0.5") == ('0', '5') assert decoupage("12") == ('12', '0') assert decoupage("3.1415") == ('3', '1415') # 额外验证多位小数场景
修复说明
- 当字符不是分隔符时,直接根据
compte的状态(0或1)将字符追加到对应部分,彻底避免小数位遗漏 - 遇到分隔符时,仅在当前处于整数部分时切换状态,避免多次切换导致逻辑混乱
- 最后判断如果小数部分为空,自动设置为
'0',满足无小数位的断言要求
内容的提问来源于stack exchange,提问作者Zekeauh
相关产品推荐
相关产品推荐

