Python中统计非零偶数数字的最简洁实现方式探究
嘿,这个问题太有意思了!刚好我也折腾过类似的Python极简写法,来跟你唠唠~
首先,先复盘下你们提到的几种方案:
- 你女友的while循环+取模+整除:是典型的数学思路,可读性强,适合理解底层逻辑,但代码长度肯定不如字符串方案
- 你的字符串遍历计数:逻辑清晰,但确实有点冗余,65字节确实有优化空间
- @iz的
sum(c in "2468" for c in str(number)):已经相当简洁了,37字节的长度很亮眼 - Ruby的
number.digits.count &:even?:不得不说Ruby的语法糖确实甜,27字节的长度让人羡慕,但咱Python也能追得很近!
更短的Python实现(35字节)
在保持变量名number不变的前提下,你可以把@iz的方案去掉冗余空格,写成:
sum(c in'2468'for c in str(number))
这个写法完全符合Python语法(生成器表达式里,关键字for和前面的表达式之间不需要额外空格),字节数比原方案少2个,而且逻辑和原方案完全一致:
- 把
number转成字符串遍历每个字符 - 判断字符是否属于非零偶数的集合
'2468'(返回True/False) sum会自动把True视为1,False视为0,最终统计总数
边界情况验证
这个方案能完美覆盖所有测试场景:
- 当
number=0时,返回0(符合“非零偶数”的要求) - 当
number=-24时,负号不在'2468'里,正确统计2和4,返回2 - 当
number=2048时,正确跳过0,统计2、4、8,返回3 - 当
number=1357时,返回0,符合预期
性能对比
虽然用了字符串转换,但Python的字符串遍历和集合判断效率很高,和Ruby的digits.count方案性能差距不大——毕竟两者本质都是把数字拆成单个元素后过滤统计,实际运行起来几乎没差别。
有没有更短的可能?
我试过各种写法,比如用map结合字符串的__contains__方法:
sum(map('2468'.__contains__,str(number)))
但这个长度是37字节,反而比上面的方案长。再比如用列表推导式转长度:
len([c for c in str(number)if c in'2468'])
长度是37字节,也不如35字节的方案短。所以目前sum(c in'2468'for c in str(number))应该是能找到的最短可行方案了。
内容的提问来源于stack exchange,提问作者Sixtyfive
相关产品推荐
相关产品推荐

