MST

星途 面试题库

面试题:Python中复杂条件下的elif代码块优化

给定一个场景,需要根据用户输入的日期(年、月、日)来判断该日期是一年中的第几天,同时要考虑闰年的情况(闰年判断条件:能被4整除但不能被100整除,或者能被400整除)。请用Python实现,要求使用多个elif代码块,并阐述如何优化这段代码,以提高其可读性和执行效率。
17.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
def day_of_year(year, month, day):
    days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
        days_in_month[1] = 29
    total_days = 0
    for i in range(month - 1):
        total_days += days_in_month[i]
    total_days += day
    return total_days

代码优化思路

  1. 提高可读性

    • 增加注释:在关键代码处添加注释,例如在判断闰年和计算总天数的地方,说明代码的作用。
    • 函数命名:使用更具描述性的函数名,如calculate_day_of_year,让代码的功能一目了然。
    • 变量命名:对于days_in_month可以改为days_per_month,增强变量含义的清晰度。
  2. 提高执行效率

    • 减少重复计算:可以将闰年判断逻辑提取到一个单独的函数中,这样如果在其他地方也需要判断闰年,直接调用该函数即可,避免重复代码。
    • 数据结构优化:如果频繁调用该函数,可以考虑使用缓存机制,例如functools.lru_cache来缓存已经计算过的结果,减少重复计算。
def is_leap_year(year):
    return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)

def calculate_day_of_year(year, month, day):
    days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if is_leap_year(year):
        days_per_month[1] = 29
    total_days = 0
    for i in range(month - 1):
        total_days += days_per_month[i]
    total_days += day
    return total_days

这里通过将闰年判断逻辑提取到is_leap_year函数中,使calculate_day_of_year函数更加简洁,提高了代码的可读性和可维护性。