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

Python中计算while循环输出总和的平均值问题求助

问题分析与解决方案

原代码存在几个核心问题导致平均值计算失败:

  • 变量作用域问题:totalMiles和dayTotal是main()函数的局部变量,外部的average()函数无法直接访问。
  • 代码执行顺序问题:average()函数中print语句写在return之后,永远不会被执行。
  • 未调用计算逻辑:代码中定义了average()但从未调用,且没有传递必要的参数。
  • 不安全的输入处理:使用eval(input())存在安全风险,应改用类型转换函数(如float())。

方案1:直接在main()内计算平均值

把平均值计算逻辑放在main()函数内部,无需额外函数,直接使用局部变量计算:

def main():
    totalMiles = 0.0
    dayTotal = 0
    # 用float替代eval,更安全
    mileageGoal = float(input("How many miles would you like to run this week? "))
    while totalMiles < mileageGoal:  # 改为<,避免刚好等于时跳过循环,同时处理超过的情况
        dailyTotal = float(input(f"How many miles did you run on day {dayTotal + 1}? "))
        totalMiles += dailyTotal
        dayTotal += 1
        if totalMiles >= mileageGoal:
            print("You hit your goal! Keep going!")
            print(f"You ran {totalMiles} miles!")
            print(f"You completed your goal in {dayTotal} days! Congratulations!")
            # 直接在main内计算并打印平均值
            average_miles = totalMiles / dayTotal
            print(f"The average miles you ran was: {average_miles:.2f}")
            break

main()

方案2:定义独立的average函数并传递参数

将totalMiles和dayTotal作为参数传递给计算函数,确保变量能被访问到,同时调整函数内的执行顺序:

def calculate_average(total, days):
    average = total / days
    print(f"The average miles you ran was: {average:.2f}")
    return average

def main():
    totalMiles = 0.0
    dayTotal = 0
    mileageGoal = float(input("How many miles would you like to run this week? "))
    while totalMiles < mileageGoal:
        dailyTotal = float(input(f"How many miles did you run on day {dayTotal + 1}? "))
        totalMiles += dailyTotal
        dayTotal += 1
        if totalMiles >= mileageGoal:
            print("You hit your goal! Keep going!")
            print(f"You ran {totalMiles} miles!")
            print(f"You completed your goal in {dayTotal} days! Congratulations!")
            # 调用计算函数并传递参数
            calculate_average(totalMiles, dayTotal)
            break

main()

额外优化点说明

  • 把totalMiles初始化为0.0,确保除法结果为浮点数,逻辑更清晰。
  • 将循环条件从totalMiles != mileageGoal改为totalMiles < mileageGoal,避免用户某天跑步超过剩余目标时循环无法终止的问题。
  • 用float(input())替换eval(input()),防止恶意输入执行危险代码,同时支持小数里程输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:55:20