You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个,而且逻辑和原方案完全一致:

  1. 把number转成字符串遍历每个字符
  2. 判断字符是否属于非零偶数的集合'2468'(返回True/False)
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:52:49