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

Python购物清单代码问题:循环终止、统计及类型转换故障排查

购物清单管理代码问题修复方案

问题1:输入数字9无法终止循环

原因

main函数中while process_grocery_store(grocery_store_list) != "break":会先调用一次process_grocery_store,如果返回"break",循环条件不成立,但循环体里又会再调用一次该函数,导致输入9时仍会执行一次函数逻辑,无法正确终止。此外,process_grocery_store中用for i in number遍历输入字符串的每个字符,这是多余的(输入应为单个功能数字)。

修复

  1. 在main函数中用变量接收process_grocery_store的返回值,避免重复调用;
  2. 移除process_grocery_store中的for i in number循环,直接判断输入的数字。

问题2:how_moch_product_name_in_list函数统计同品名商品数量错误

原因

  • 循环中用for check_how_much_product_name_in_grocery_list in grocery_list覆盖了用户输入的变量名,导致原输入的商品名丢失;
  • 判断条件if check_how_much_product_name_in_grocery_list in grocery_list永远为真(当前遍历元素本身就在列表里),因此统计的是列表总长度而非指定商品的数量。

修复

  • 重命名循环变量,避免覆盖输入变量;
  • 判断循环元素是否等于用户输入的商品名,相等时计数加1。

问题3:将number转为int后出现'int' object is not iterable错误

原因

原代码中存在for i in number循环,当number转为int类型后,整数无法被遍历,因此抛出该错误。

修复

移除遍历输入数字的循环,直接将输入转为int后进行条件判断,因为输入应为单个功能数字,无需遍历。


完整修正代码

def print_list(grocery_list):
    """打印购物清单
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    print(grocery_list)

def print_len_list(grocery_list):
    """打印购物清单长度
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    print(len(grocery_list))

def product_in_grocery_list(grocery_list):
    """检查商品是否在购物清单中
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    check_product = input("请输入要检查的商品名:")
    print(check_product in grocery_list)

def how_moch_product_name_in_list(grocery_list):
    """统计指定商品在购物清单中的数量
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    target_product = input("请输入要统计的商品名:")
    count = 0
    for item in grocery_list:
        if item == target_product:
            count += 1
    print(count)

def delete_product_from_list(grocery_list):
    """从购物清单中删除指定商品
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    delete_product = input("请输入要删除的商品名:")
    if delete_product in grocery_list:
        grocery_list.remove(delete_product)
        print(grocery_list)
    else:
        print("该商品不在清单中")

def add_product_to_list(grocery_list):
    """向购物清单中添加商品
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    add_product = input("请输入要添加的商品名:")
    grocery_list.append(add_product)
    print(grocery_list)

def print_ilegal_products(grocery_list):
    """打印清单中的非法商品(非纯字母或长度小于3)
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    illegal_products = []
    for item in grocery_list:
        if not item.isalpha() or len(item) < 3:
            illegal_products.append(item)
    print(illegal_products)

def remove_duplicates_from_list(grocery_list):
    """移除购物清单中的重复商品
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: 无
    :rtype: None
    """
    grocery_list[:] = list(dict.fromkeys(grocery_list))
    print(grocery_list)

def process_grocery_store(grocery_list):
    """处理购物清单的功能选择
    输入数字触发对应功能,输入9终止循环
    :param grocery_list: 购物列表
    :type grocery_list: list
    :return: "break"表示终止,否则返回None
    :rtype: str or None
    """
    try:
        number = int(input("请输入功能数字(1-8执行功能,9退出):"))
    except ValueError:
        print("请输入有效的数字")
        return None
    
    if number == 1:
        print_list(grocery_list)
    elif number == 2:
        print_len_list(grocery_list)
    elif number == 3:
        product_in_grocery_list(grocery_list)
    elif number == 4:
        how_moch_product_name_in_list(grocery_list)
    elif number == 5:
        delete_product_from_list(grocery_list)
    elif number == 6:
        add_product_to_list(grocery_list)
    elif number == 7:
        print_ilegal_products(grocery_list)
    elif number == 8:
        remove_duplicates_from_list(grocery_list)
    elif number == 9:                
        return "break"
    else:
        print("请输入1-9之间的数字")

def main():
    grocery_store_list = ['cucumber', 'cheese', 'egg', 'soap', 'tomato', 'chips', 'fish', 'meat', 'soymilk', 'chocolate', 'coffee', 'lettuce', 'orange', 
                          'apple', 'salmon', 'bread', 'beer', 'beer']
    while True:
        result = process_grocery_store(grocery_store_list)
        if result == "break":
            break

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:50:25