Python购物清单代码问题:循环终止、统计及类型转换故障排查
购物清单管理代码问题修复方案
问题1:输入数字9无法终止循环
原因
main函数中while process_grocery_store(grocery_store_list) != "break":会先调用一次process_grocery_store,如果返回"break",循环条件不成立,但循环体里又会再调用一次该函数,导致输入9时仍会执行一次函数逻辑,无法正确终止。此外,process_grocery_store中用for i in number遍历输入字符串的每个字符,这是多余的(输入应为单个功能数字)。
修复
- 在main函数中用变量接收
process_grocery_store的返回值,避免重复调用; - 移除
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
相关产品推荐
相关产品推荐

