CS50餐食时间问题:convert()函数返回小数报错但手动测试正常
问题:convert函数报错未返回小数,但手动测试通过,原因分析
需求说明
需要提示用户输入#:## a.m./p.m.格式的时间,convert函数需将输入时间转换为float类型并返回,再根据返回值输出对应提示文本(早餐/午餐/晚餐时间或无效提示)。
问题描述
收到报错提示convert函数未返回小数,但手动输入测试时终端所有测试均通过,请问问题出在哪里?
原代码
def main(): text = input("time here: ") time = convert(text) # call the function convert() and assign it to time variable, different from the one in the function print(time, type(time)) # check if the function returns a float value if 7 <= time <= 8: # simple logic for defining time print("breakfast time") elif 12 <= time <= 13: print("lunch time") elif 18 <= time <= 19: print("dinner time") elif time >= 24: # ensure that you can't type in number > 24 print("Not a valid time point.") else: None # print None (null) for other cases def convert(time): hour, minute, period = time.replace(":", " ").split(" ") # unpack the list with 3 arguments (3rd arugment is period = am/pm) and define floats hour = float(hour) minute = float(minute) / 60 n_time = hour + minute # assign to a new variable n_time which should return float return round(n_time, 2) # return float, rounded to 2 decimals if __name__ == "__main__": main()
问题分析与解决
你的convert函数虽然能返回float类型,但存在未处理12小时制到24小时制转换的核心问题,这会导致返回的数值不符合测试用例的预期(可能报错信息描述不准确,实际是数值而非类型问题):
- 输入
12:xx a.m.时,当前代码返回12.xx(如12:30 a.m.返回12.5),但实际应转换为0.xx - 输入
1:xx p.m.到11:xx p.m.时,当前代码返回1.xx-11.xx(如1:00 p.m.返回1.0),但实际应转换为13.xx-23.xx
此外,原代码的格式拆分逻辑依赖replace(":"," ")后split,若输入格式有细微差异(如空格数量)可能出错,建议调整拆分方式。
修正后的convert函数
def convert(time): # 拆分周期和时分部分,避免依赖replace的拆分逻辑 time_parts = time.split(" ") period = time_parts[-1] hour_minute = time_parts[0].split(":") hour = float(hour_minute[0]) minute = float(hour_minute[1]) / 60 n_time = hour + minute # 处理12小时制转24小时制 if period.lower() == "a.m.": if hour == 12: n_time -= 12 else: # p.m. if hour != 12: n_time += 12 return round(n_time, 2)
同时,main函数中else: None可改为pass,因为None在这里不会产生任何输出,仅作为占位符使用。
内容的提问来源于stack exchange,提问作者Luka Z
相关产品推荐
相关产品推荐

