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
相关产品推荐
相关产品推荐

