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

如何修复Python点餐程序中运行小计无法正确累加的问题?

修复食品订单小计累加问题

问题根源

你的代码存在几个关键错误导致小计始终为0:

  • 递归调用导致变量丢失:每次调用student_order()都会重新创建一套计数变量(coffee_count等),之前的订单数据根本没被保留。
  • 计数变量初始化位置错误:每次选完有效食品后都重置计数,之前的订单直接被清空。
  • 字符串累加而非数值运算:order_quantity是输入的字符串,直接+=会变成字符串拼接,根本没做数值累加。
  • while循环条件逻辑错误:用or判断"不等于NO/no/No",这个条件永远为真(比如输入"No"时,它不等于"NO"和"no",条件还是成立),导致循环逻辑混乱。
  • 递归后代码无法执行:调用student_order()后,程序进入新的函数实例,原函数里的计数累加代码永远不会运行。

修复步骤

  1. 把计数变量初始化放在函数开头,确保整个订单流程中只初始化一次。
  2. 去掉递归调用,改用循环处理多次订单请求。
  3. 将order_quantity转换为整数,保证数值累加正确。
  4. 修正while循环条件,用and判断用户是否没有输入任何"No"的变体(或直接用lower()简化判断)。
  5. 重新梳理流程:先初始化计数,然后循环接收订单,直到用户选择不再添加。

修正后的代码

print("Welcome! Here is today's menu.") 
print("")

print("- Coffee ($2)") 
print("- Burger ($4)") 
print("- Juice ($3)") 
print("- Muffin ($2)") 
print("- Burrito ($5)") 
print("")

def student_order(): 
    # 初始化计数变量,整个订单流程只初始化一次
    coffee_count = 0
    burger_count = 0
    juice_count = 0
    muffin_count = 0
    burrito_count = 0

    while True:
        order = input("What would you like to order today?: ")
        print("")

        # 简化菜单有效性判断
        if order in ['Coffee', 'Burger', 'Juice', 'Muffin', 'Burrito']:  
            # 转换为整数,避免字符串累加问题
            order_quantity = int(input("Quantity: "))
            print("")
            print(f"Thank you for your order! You ordered {order_quantity} {order}.")

            # 累加对应食品数量
            if order == 'Coffee': 
                coffee_count += order_quantity
            elif order == 'Burger': 
                burger_count += order_quantity
            elif order == 'Juice': 
                juice_count += order_quantity
            elif order == 'Muffin': 
                muffin_count += order_quantity
            elif order == 'Burrito': 
                burrito_count += order_quantity

            # 询问是否继续点餐
            order_more = input("Anything else? (Yes or No): ")
            print("")
            # 统一转为小写判断,简化条件
            if order_more.lower() == 'no':
                break
        else: 
            print(f"Sorry, {order} is not on today's menu. Please choose another item.")
            print("")
            # 不中断循环,让用户重新选择

    # 计算并打印订单总额
    order_subtotal = (coffee_count * 2.00) + (burger_count * 4.00) + (juice_count * 3.00) + (muffin_count * 2.00) + (burrito_count * 5.00)
    print("Thank you for your order!")
    print("")            
    print("Your order subtotal is: $", round(order_subtotal, 2))
    print("")
    order_tax = order_subtotal * 0.13
    print("Your tax is: $", round(order_tax, 2))
    print("")
    total = order_subtotal + order_tax
    print("Your total is: $", round(total, 2))
    print("")
    print("Please pick up your order at the counter. Have a good day!")

student_order()

额外优化点

  • 用order in [...]简化菜单判断逻辑,更简洁。
  • 使用f-string格式化输出,可读性更强。
  • 对金额进行四舍五入,保留两位小数,符合货币显示习惯。
  • 统一用lower()判断用户输入,减少重复的条件判断。

内容的提问来源于stack exchange,提问作者newcoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:15:02