如何简化判断月份天数的嵌套if-else代码?
简化月份天数判断代码的几种可行方法
当然可以简化这段代码,核心思路是把重复的逻辑抽离出来,只单独处理2月的特殊情况,以下是几种常用的简化方案:
方案一:抽离2月判断,统一处理其他月份
把2月的闰年/非闰年判断单独拿出来,剩下的月份逻辑只写一次,避免重复:
if month == 2: return 29 if isLeapYear else 28 elif month in {4, 6, 9, 11}: return 30 else: return 31
这里用集合{4,6,9,11}代替多个or判断,代码更简洁;2月的返回值用三元表达式一键处理闰年差异,整体逻辑清晰,没有冗余代码。
方案二:用列表/字典映射固定天数
把每个月份的常规天数存到列表或字典里,仅针对2月的闰年情况做特殊处理:
列表版(更紧凑)
# 索引0对应1月,索引1对应2月,以此类推 month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if month == 2 and isLeapYear: return 29 return month_days[month - 1]
字典版(更直观)
month_days = { 1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31 } if month == 2 and isLeapYear: return 29 return month_days[month]
这种方法可读性极强,固定天数一目了然,仅需处理2月的特殊场景,非常适合维护。
方案三:单行三元表达式(不推荐,可读性差)
如果追求极致简洁,可以用嵌套三元表达式实现,但代码可读性会下降,仅适合简单场景:
return 29 if month == 2 and isLeapYear else 28 if month == 2 else 30 if month in {4, 6, 9, 11} else 31
总结
推荐使用方案一或方案二,既能消除冗余代码,又能保持良好的可读性,后续维护也更方便。
内容的提问来源于stack exchange,提问作者Mankesh Raj
相关产品推荐
相关产品推荐

