如何在主函数中正确调用套餐计费相关的自定义Python函数?
套餐计费程序函数整合方案
问题概述
我开发了一套用于套餐计费程序的自定义Python函数,需要在主函数中按规则调用完成功能,要求如下:
- 输入处理仅可使用
getPackage、validPackage、getHours、validHours函数及程序控制结构; - 计费计算仅可使用
calculatePkg_A、calculatePkg_B、calculatePkg_C函数及程序控制结构; - 输出需展示所选套餐、使用时长及月度费用。
各函数功能说明:
getPackage:获取用户输入的套餐类型(A/B/C);validPackage:验证套餐输入是否为A/B/C;getHours:获取用户输入的使用时长(浮点型);validHours:验证时长是否在0-720之间;calculatePkg_A/B/C:根据对应套餐规则计算月度费用。
当前主函数调用逻辑存在问题,需指导正确整合调用方式,现有代码如下:
def getPackage(v): v=str(input("Choose a package. Must be A, B, or C")) def validPackage(l): if l != "A" or l!="B" or l!="C": print("Input must be A,B,C. Please choose a valid package") def getthehours(z): z=str(input("Enter a number of hours between 0 and 720")) def validhours(gethours): if gethours<0 or gethours>720: print("Invalid number. Numbers must be between 0 to 720") else: print("GOOD HOUR CHOICE") def calculatepkg_A(hoursprovided): if hoursprovided<50: print("Your cost is $15 per month") elif hoursprovided>50: x=hoursprovided-50 print((2*x)+15) def calculatepkg_B(hoursprovided): if hoursprovided<100: print("Your cost is $20 per month") elif hoursprovided>100: x=hoursprovided-100 print((1.5*x)+20) def calculatepkg_C(hoursprovided): if hoursprovided<150: print("Your cost is $25 per month") elif hoursprovided>=150: x=hoursprovided-150 print((1*x)+25) def main(): n=str(input("Choose a package. Must be A, B, or C")) l=float(input("Choose a number of hours between 0 and 720")) getPackage(n) validhours(l) if n=="A": calculatepkg_A(l) elif n=="B": calculatepkg_B(l) elif n=="C": calculatepkg_C(l)
原代码问题分析
- 函数无返回值:
getPackage、getthehours仅修改内部参数(Python参数传递为赋值传递,外部变量不受影响),未返回输入结果,导致主函数无法获取有效输入; - 验证逻辑错误:
validPackage用or判断,会导致任何输入都触发错误提示(比如输入"A"时,l!="B"为真,条件成立),应改为and或直接判断是否在合法列表中; - 函数命名不规范:不符合要求的命名(如
getthehours应改为getHours,validhours改为validHours),且主函数未调用validPackage验证套餐; - 主函数违规输入:主函数直接调用
input获取值,未使用指定的输入处理函数; - 输出不符合要求:计算函数单独打印费用,无法统一展示套餐、时长和费用信息。
修正后的完整代码
def getPackage(): # 获取套餐输入,返回处理后的大写值 return input("Choose a package. Must be A, B, or C: ").strip().upper() def validPackage(package): # 验证套餐合法性,返回布尔值 if package not in ["A", "B", "C"]: print("Input must be A,B,C. Please choose a valid package") return False return True def getHours(): # 获取时长输入,转换为浮点型并返回,处理非数字输入 while True: try: hours = float(input("Enter a number of hours between 0 and 720: ").strip()) return hours except ValueError: print("Please enter a valid number.") def validHours(hours): # 验证时长范围,返回布尔值 if hours < 0 or hours > 720: print("Invalid number. Numbers must be between 0 to 720") return False return True def calculatePkg_A(hoursprovided): # 返回套餐A的计算费用 if hoursprovided <= 50: return 15.0 extra_hours = hoursprovided - 50 return 15 + (2 * extra_hours) def calculatePkg_B(hoursprovided): # 返回套餐B的计算费用 if hoursprovided <= 100: return 20.0 extra_hours = hoursprovided - 100 return 20 + (1.5 * extra_hours) def calculatePkg_C(hoursprovided): # 返回套餐C的计算费用 if hoursprovided <= 150: return 25.0 extra_hours = hoursprovided - 150 return 25 + (1 * extra_hours) def main(): # 循环获取合法套餐输入 package = getPackage() while not validPackage(package): package = getPackage() # 循环获取合法时长输入 hours = getHours() while not validHours(hours): hours = getHours() # 根据套餐计算费用 if package == "A": cost = calculatePkg_A(hours) elif package == "B": cost = calculatePkg_B(hours) else: cost = calculatePkg_C(hours) # 统一输出结果 print(f"\n套餐选择: {package}") print(f"使用时长: {hours:.2f} 小时") print(f"月度费用: ${cost:.2f}") if __name__ == "__main__": main()
关键修改说明
- 输入函数调整:
getPackage、getHours改为直接返回输入值,无需传入参数,避免传递无效问题; - 验证函数优化:返回布尔值,方便主函数循环判断,直到用户输入合法;
- 计算函数调整:所有计算函数返回费用数值,由主函数统一组织输出,符合展示要求;
- 主函数逻辑修正:完全使用指定函数处理输入,循环验证确保合法性,最后统一展示所有信息。
内容的提问来源于stack exchange,提问作者sharna sar
相关产品推荐
相关产品推荐

