【问题标题】:How do I add a separate function for average calculation?如何为平均值计算添加单独的函数?
【发布时间】:2020-08-10 12:49:49
【问题描述】:

我被这个问题困住了。到目前为止我的代码有效,但我的教授希望看到一些变化。我需要添加错误处理,并且我需要一个单独的函数来计算我将在 main 中调用的平均值。这是我到目前为止所拥有的......

import os

def process_file(filename):
    f = open(filename,'r')
    lines = f.readlines()[1:]
    f.close()

    scores = []

    for line in lines:
        parsed = line.split(",")
        count = int(parsed[1])
        scores.append(count)

    calculate_result(scores)

def calculate_result(scores):
    print("High: ", max(scores))
    print("Low: ", min(scores))
    print("Average: ", sum(scores)/len(scores))


def main():
    filename = "scores.text"
    if os.path.isfile(filename):
        process_file(filename)
    else:
        print ("File does not exist")
        return 0


main()

【问题讨论】:

  • 你真正坚持的是哪一部分?这些是非常具体的说明,您是否遇到了困难?
  • def average(lst): return sum(lst)/len(lst) 然后print("Average: ", average(scores))
  • 因此,如果我摆脱整个 calculate_result 函数并将其替换为 calculate_average(scores)。然后在 main() 中调用它。那行得通吗?

标签: python string file exception average


【解决方案1】:

我猜有两部分:

我需要添加错误处理

我需要一个单独的函数来计算我将在 main 中调用的平均值

第二部分我认为你不需要帮助。但是错误处理是一种艺术,所以我可以看到你可能会被困在哪里。以下是一些帮助入门的建议。

最常见的错误处理类型涉及处理输入。从更广泛的角度考虑,我们可以将其扩展到任何跨越程序内存空间边界的东西。这不仅包括用户输入,还包括输出;文件系统交互;使用网络接口(或任何通信设备或硬件接口);启动/停止或以其他方式与其他程序交互;调用一个代表我们做这些事情的图书馆;还有更多……

那么,您的程序的哪些部分与“外部”交互?我可以看到一些:

  1. main() 中,程序假设存在一个文件。您已经在检查以确保该文件存在,如果不存在则返回0(您可能希望将其更改为非零值,因为0 通常用于表示没有发生错误)
  2. process_file() 这样做:f = open(filename,'r') 但你确定这会奏效吗?是否存在可能失败的条件?
    • 如果运行程序的用户没有读取该文件的权限怎么办?
    • 如果文件在签入main 和随后的open 调用process_file 之间被删除或更改怎么办?这是TOCTOU race condition,每个软件开发人员都需要注意这一点。
  3. 这个程序潜在错误的最明显来源可能是输入文件的内容:
    • 我们假设输入是逗号分隔的。如果用户使用制表符或其他字符怎么办?
    • 在处理这些行时,您得到了:count = int(parsed[1]),但是您怎么知道 parsed[1] 可以转换为 int
    • 如果文件存在但为空会发生什么(提示:len(scores)==0)?始终关注这些极端情况。

最后,您似乎正在使用if-then 语句进行错误检查。这很好,但另一个处理错误的强大工具是try-except 语句。它们不是相互排斥的:有时使用if 语句更容易,有时使用try-except 捕获异常更好。您需要处理的一些错误使用一种方法比另一种更容易处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 2021-02-14
    • 2017-06-11
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多