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

CS50‘Meal Time’习题如何通过check50测试?代码优化及语法疑问

CS50 Meal Time 代码优化建议与问题解析

代码导致check50失败的核心问题

  • 非用餐时段触发变量未定义错误:当输入时间不在7-8、12-13、18-19区间时,timetoeat变量没被赋值,执行print(timetoeat)会直接报错。
  • 不支持AM/PM格式输入:CS50测试用例大概率包含7:00 AM、1:00 PM这类带时段后缀的输入,原代码直接按冒号分割会崩溃。
  • convert函数不符合题设要求:题目要求convert函数返回用餐时段字符串,而非直接打印。check50通常会测试函数返回值,而非标准输出内容。

优化后的代码

def main():
    time = input("What time is it? ").strip()
    
    # 兼容12小时制(带AM/PM)和24小时制输入
    if " " in time:
        time_part, period = time.split()
        hours, minutes = time_part.split(":")
        hours = float(hours)
        # 12小时制转24小时制
        if period.lower() == "pm" and hours != 12:
            hours += 12
        elif period.lower() == "am" and hours == 12:
            hours = 0
    else:
        hours, minutes = time.split(":")
        hours = float(hours)
    
    total_hours = hours + float(minutes) / 60
    meal_time = convert(total_hours)
    if meal_time:
        print(meal_time)


def convert(time):
    if 7 <= time <= 8:
        return "breakfast time"
    elif 12 <= time <= 13:
        return "lunch time"
    elif 18 <= time <= 19:
        return "dinner time"
    # 非用餐时段返回None,避免报错
    return None


if __name__ == "__main__":
    main()

优化点说明

  • 新增AM/PM适配逻辑:自动识别时段后缀并转换为24小时制,覆盖所有测试输入格式。
  • convert函数改为返回值模式:符合题设的函数设计要求,方便check50测试返回结果。
  • 处理非用餐时段:避免未定义变量的错误,非用餐时段不输出内容(可按需调整)。
  • 输入去空格处理:用strip()清理输入前后的多余空格,提升代码鲁棒性。

简单解释if __name__ == "__main__":的作用

把Python脚本当成一本可独立阅读的书:

  • 当你直接打开这本书运行(比如命令行输入python meal.py),这本书的“标识名”__name__会被自动设为"__main__",此时条件成立,就会执行main()函数,相当于启动整本书的内容。
  • 如果你把这本书作为“章节”导入到其他脚本里(比如import meal),此时它的__name__会变成文件名"meal",条件不成立,main()就不会自动执行——就像你引用其他书的章节时,不会自动把那本书的前言也读一遍。

这个判断的核心作用是:让脚本既能独立运行,又能作为模块被其他代码复用,不会触发不必要的执行逻辑。

内容的提问来源于stack exchange,提问作者Paul Albert Mina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:35:11