Python数字计数函数需忽略前导零的实现问题
解决方法:忽略转换新增的前导零并正确统计数字
首先咱们拆解下问题根源:你的原函数里n=str(int(n))这一步会直接截断小数部分,把0.123转成整数0,最后只统计了这个新增的前导零,所以得到(0,0,1)。要忽略这个零,咱们得调整函数逻辑,先判断这个零是不是转换时额外加上的,再决定是否统计它。
方案一:完全匹配你的预期(返回(0,0,0))
如果你的需求是:当输入是0.123这种由.123转换而来的数时,完全忽略这个新增的前导零(且不统计小数部分),可以用这个版本:
def digit_count(n): n_str = str(n) # 检查是否是转换后新增的前导零情况:以0.开头 if n_str.startswith('0.'): # 忽略这个新增的0,直接返回你预期的结果 return (0, 0, 0) # 处理其他正常整数/带非零整数部分的小数 n = str(int(n)) even_count = 0 odd_count = 0 zero_count = 0 for i in n: num = int(i) if num == 0: zero_count +=1 elif num % 2 ==0: even_count += 1 else: odd_count +=1 return (even_count, odd_count, zero_count)
测试效果:
- 输入
0.123,函数直接返回(0,0,0),完全符合你的预期; - 输入正常整数比如
1230,会返回(1,2,1)(偶数1个,奇数2个,零1个),逻辑正常。
方案二:统计小数部分的有效数字(更实用的场景)
如果你其实是想统计.123里的1、2、3(而非返回全零),只是不想算那个新增的前导零,那可以用这个版本——它会去掉前导零和小数点,统计所有有效数字:
def digit_count(n): n_str = str(n) # 去掉0.开头的前导零 if n_str.startswith('0.'): n_str = n_str[1:] # 移除小数点,只保留数字字符 digits = n_str.replace('.', '') even_count = 0 odd_count = 0 zero_count = 0 for i in digits: num = int(i) if num == 0: zero_count +=1 elif num % 2 ==0: even_count += 1 else: odd_count +=1 return (even_count, odd_count, zero_count)
测试效果:
- 输入
0.123,会返回(0,3,0)(三个奇数,无偶数和零); - 输入
0.102,会返回(1,1,1)(偶数1个,奇数1个,零1个)。
原函数的核心问题
原函数里的n=str(int(n))会强制把所有输入转成整数,既丢失了小数部分,还会把0.123这种数转成"0",自然会统计到那个你不想算的前导零。上面的方案通过提前判断字符串前缀,完美规避了这个问题。
内容的提问来源于stack exchange,提问作者Callie Moffett
相关产品推荐
相关产品推荐

