convert函数测试异常排查:返回十进制小时却不符合预期?
代码问题排查:convert函数返回值不符合测试预期
我的代码
def main(): askForTime = input("What time is it? ").strip().split() time = convert(askForTime) if 7 <= time <= 8: print("breacfast time") elif 12 <= time <= 13: print("lunch time") elif 18 <= time <= 19: print("dinner time") def convert(clock): if "p.m" in clock or "pm" in clock: hours, minutes = clock[0].split(":") timer = (float(hours) + 12) + (float(minutes) / 60) return timer else: hours, minutes = clock[0].split(":") timer = float(hours) + (float(minutes) / 60) return timer if __name__ == "__main__": main()
测试错误提示
convert successfully returns decimal hours expected "7.5", not "Error\n"
问题原因
测试用例大概率是直接向convert函数传入了字符串(比如"7:30"),但你的代码里convert函数设计为接收列表类型参数(因为main里用split()把输入转成了列表再传入)。
当传入字符串时:
clock[0]会取字符串的第一个字符(比如"7"),而非完整的时间字符串- 对单个字符调用
split(":")会得到仅包含该字符的列表,无法解包成hours和minutes,直接抛出ValueError,导致测试得到Error而非预期的7.5
另外代码存在拼写错误:breacfast应为breakfast,但这不是当前测试失败的原因。
修复方案
修改convert函数,使其兼容字符串和列表两种输入格式,同时调整12小时制的边界处理逻辑:
def convert(clock): # 统一处理输入:如果是列表取第一个元素,否则直接用字符串 time_str = clock[0].strip() if isinstance(clock, list) else clock.strip() # 标记是否为下午时间,并移除am/pm标识 is_pm = "p.m" in time_str or "pm" in time_str time_str = time_str.replace("p.m", "").replace("pm", "").replace("a.m", "").replace("am", "").strip() # 分割小时和分钟并转换为数值 hours, minutes = time_str.split(":") hours_float = float(hours) minutes_float = float(minutes) / 60 # 处理12小时制转24小时制的边界情况 if is_pm and hours_float != 12: hours_float += 12 elif not is_pm and hours_float == 12: hours_float = 0 return hours_float + minutes_float
这个版本的convert函数既可以接收main里传入的列表,也能直接接收字符串输入,同时处理了12pm/12am这类特殊时间的转换。
内容的提问来源于stack exchange,提问作者اسلام سامح
相关产品推荐
相关产品推荐

