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

Python费用分类代码分类失效、while循环异常终止问题排查

问题根因

代码存在两处核心逻辑错误,直接导致你遇到的两个异常:

  • 条件判断写法不符合Python语法规则:你写的if category == str("Bill") or str("bill")、if repeat == "No" or "no"这类写法中,or关键字后直接跟的非空字符串会被Python解释器判定为永久真值。因此分类判断时第一个if分支永远成立,所有条目都会被追加到bills列表;退出判断时不管输入什么内容,都会触发add_items = False直接终止循环。
  • 输入采集位置错误:你把费用名称、金额、类别的输入语句放在了while循环外部,就算循环逻辑正常,也只会反复追加第一次输入的同一条费用,无法采集新的条目。
修正后可运行代码
# 创建按费用类别分类的记账程序
# 初始化不同类别的费用存储列表
bills = []
fun = []
take_out = []

def items_list():
    """接收用户输入并按类别分类费用的函数"""
    print("请在此添加你的费用条目")
    add_items = True

    while add_items:
        # 把输入采集移到循环内部,每次循环都接收新条目
        name = input("费用名称: ")
        cost = input("费用金额: ")
        category = input("费用类别(Bill/账单/Fun/娱乐/Take Out/外食): ").strip()
        expense = f"{name}, {cost}, {category}"

        # 统一转小写后判断类别,避免大小写输入导致匹配失败
        cat_lower = category.lower()
        if cat_lower == "bill":
            bills.append(expense)
        elif cat_lower == "fun":
            fun.append(expense)
        elif cat_lower == "take out":
            take_out.append(expense)
        else:
            print("输入的类别无效,该条目未归类")

        # 修正退出判断逻辑,统一处理大小写和前后空格
        repeat = input("是否要添加下一条费用?(Yes/No): ").strip()
        if repeat.lower() == "no":
            add_items = False

items_list()
print("账单类费用:", bills)
print("娱乐类费用:", fun)
print("外食类费用:", take_out)
额外优化点
  • 用.lower()统一把用户输入转成小写再判断,不用分别匹配首字母大写、全小写的输入情况,容错性更高
  • 加了.strip()处理用户输入前后不小心带的空格,避免因为多打了空格导致匹配失败
  • 增加了无效类别的提示,用户输错类别时能得到明确反馈

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:57:12