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

Python汽车数据收集程序仅显示最后录入车辆数据的问题求助

问题排查与修复方案

你的代码核心问题出在递归调用+数据存储逻辑错误,导致所有车辆数据没法统一保存,最后只能显示最后一辆。具体问题和修复方案如下:

核心问题拆解

  • 递归调用collect_car_data()会每次创建新的cars列表,之前录入的车都存在上一级函数的列表里,最后结束时只能拿到最后一次调用的列表,自然只有一辆。
  • 只有用户选no时才把当前车加入列表,选yes时直接递归,当前车的数据根本没存下来。
  • 找最低价的逻辑完全错误:cars列表里只存了车辆的字符串信息,没有价格;而且遍历的时候拿的是当前车的net_sale_price,不是每辆车的价格,根本没法比较。

修复后的完整代码

def collect_car_data():
    lowest_price = float('inf')
    cars = []  # 统一存储所有车辆的完整信息(含价格)
    incorrect_input_count = 0

    while True:
        # 录入品牌
        while True:
            car_make = input("Enter the make of the car, can't contain numbers or exceed 15 characters (0 to end): ").strip()
            if car_make == '0':
                # 用户输入0结束,检查是否有录入车辆
                if not cars:
                    print("No cars entered.")
                    return
                break
            elif len(car_make) > 15 or any(char.isdigit() for char in car_make):
                print("Invalid car make. Please try again.")
                incorrect_input_count += 1
                if incorrect_input_count >= 3:
                    print("Failed to input a correct answer too many times. Program terminated.")
                    return
            else:
                incorrect_input_count = 0
                break
        if car_make == '0':
            break

        # 录入型号
        while True:
            car_model = input("Enter the model of the car, can't contain numbers or exceed 15 characters: ").strip()
            if len(car_model) > 15 or any(char.isdigit() for char in car_model):
                print("Invalid car model. Please try again.")
                incorrect_input_count += 1
                if incorrect_input_count >= 3:
                    print("Failed to input a correct answer too many times. Program terminated.")
                    return
            else:
                incorrect_input_count = 0
                break

        # 录入年份
        while True:
            car_year = input("Enter the year of the car, must contain 4 digits: ")
            if len(car_year) != 4 or not car_year.isdigit():
                print("Invalid car year. Please try again.")
                incorrect_input_count += 1
                if incorrect_input_count >= 3:
                    print("Failed to input a correct answer too many times. Program terminated.")
                    return
            else:
                incorrect_input_count = 0
                break

        # 录入价格
        while True:
            car_price = input("Enter the ticket price, must be between 1 and 1000000 (0 decimal places) $: ")
            # 修复价格范围判断,包含边界值
            if car_price.isdigit() and 1 <= int(car_price) <= 1000000:
                incorrect_input_count = 0
                break
            else:
                print("Invalid ticket price. Please try again.")
                incorrect_input_count += 1
                if incorrect_input_count >= 3:
                    print("Failed to input a correct answer too many times. Program terminated.")
                    return

        # 计算折扣和净价
        car_price_int = int(car_price)
        discount = car_price_int * 0.10
        net_sale_price = car_price_int - discount
        print(f"The discount for cash on this {car_year} {car_make} {car_model} is: $ {discount:.2f}")
        print(f"The net sale price of this car is: $ {net_sale_price:.2f}")

        # 立即保存当前车辆的完整信息(含净价)
        cars.append({
            'info': f"{car_year} {car_make} {car_model}",
            'net_price': net_sale_price
        })

        # 实时更新最低价
        if net_sale_price < lowest_price:
            lowest_price = net_sale_price

        # 询问是否继续录入
        while True:
            another_car = input("Do you want to enter details for another car? (yes/no): ")
            if another_car.lower() == "yes":
                incorrect_input_count = 0
                break  # 回到外层循环,继续录入下一辆
            elif another_car.lower() == "no":
                print("Thank you for using our program!")
                break  # 退出所有循环,进入统计展示
            else:
                incorrect_input_count += 1
                if incorrect_input_count >= 3:
                    print("Failed to input a correct answer too many times. Program terminated.")
                    return
                print("Incorrect input. Please enter 'yes' or 'no'.")
        if another_car.lower() == "no":
            break

    # 展示统计信息
    print(f"Number of cars you looked at: {len(cars)}")
    print("The cars you looked at were:")
    for car in cars:
        print(car['info'])

    # 找到最低价对应的车辆
    lowest_car = next(car for car in cars if car['net_price'] == lowest_price)
    print(f"The lowest net sale price was the {lowest_car['info']} at: $ {lowest_price:.2f}")

collect_car_data()

关键修改说明

  1. 去掉递归,改用单循环结构:所有车辆录入都在同一个函数的循环里,cars列表全局存储所有数据,不会分散丢失。
  2. 实时保存车辆数据:每录入完一辆车就立即把完整信息(含净价)存入列表,不管用户选yes还是no,数据都不会丢失。
  3. 用字典存储车辆完整信息:既可以展示品牌/型号/年份,又能保留价格用于比价。
  4. 实时更新最低价:每录入一辆车就检查更新最低价,避免最后遍历的冗余和错误。
  5. 修复价格范围判断:原代码排除了1和1000000的边界值,现在符合输入提示的要求。
  6. 处理空录入场景:如果用户直接输入0结束,会提示无车辆录入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:09:58