在 Python 数组中使用 max() 和 min() 失败

Using max() and min() unsuccessfully in Python array

Context: 继续我对Python的自学,我最近完成了一个教科书练习,要求一个允许用户定义[=35的程序=] 年数,并且能够为 'x' 中的每个月输入一个降雨量值。

问题:下面是我的代码,它可以工作'ok',但是最近的练习要求我'expand'我的代码显示最大和最小的数值用户在打印语句中输入降雨量。

披露:我已经查看 S.O 尝试找到我的问题的解决方案,但似乎没有什么足以解决我的挑战,可以帮助我。

我试过的: 我试过使用 max()min() 但是当我输入代码 print(max(monthlyRainfall)print(min(monthlyRainfall)

def yearsToTrack():
    userYearsTracking = int(input("How many years do you want to track: "))
    return userYearsTracking

def calculationAlgorithm(userYearsTracking):
    totalMonths = 0
    totalRainfall = 0
    for currentYear in range (1, userYearsTracking +1):
        for currentMonth in range (1, 13):
            monthlyRainfall = int(input("Inches of rainfall for month " + format(currentMonth, "d",) + " | year " +
                                    format(currentYear, "d",)+": "))
            totalMonths += 1
            totalRainfall += monthlyRainfall
    averageRainfall = totalRainfall / totalMonths
    print("Total months: " + str(totalMonths))
    print("Total rain:", format(totalRainfall), "(inch)")
    print("Total average rainfall:", round(averageRainfall,2), "(inch)")

def main():
    userYearsTracking = yearsToTrack()
    calculationAlgorithm(userYearsTracking)
main()

有没有人能提供一些 'pointers' 我哪里出错了?

您可以使用 sys.maxsize0 来使用变量来跟踪最小和最大降雨量值,实际上用户永远不会分别输入 above above 或 below 。

然而,对于第二种情况,只是为了确保您还可以添加一个简单的检查以确保用户不会输入负降雨量:

def calculationAlgorithm(userYearsTracking):
    totalMonths = 0
    totalRainfall = 0
    maxRainfall = 0
    minRainfall = sys.maxsize
    for currentYear in range (1, userYearsTracking +1):
        for currentMonth in range (1, 13):
            monthlyRainfall = int(input("Inches of rainfall for month " + format(currentMonth, "d",) + " | year " +
                                    format(currentYear, "d",)+": "))
            if monthlyRainfall < 0:
                print("Error invalid rainfall entered")
                sys.exit()
            if monthlyRainfall > maxRainfall:
                maxRainfall = monthlyRainfall
            if monthlyRainfall < minRainfall:
                minRainfall = monthlyRainfall
            totalMonths += 1
            totalRainfall += monthlyRainfall
    averageRainfall = totalRainfall / totalMonths
    print("Total months: " + str(totalMonths))
    print("Total rain:", format(totalRainfall), "(inch)")
    print("Total average rainfall:", round(averageRainfall,2), "(inch)")
    print("Largest input rainfall: " + str(maxRainfall))
    print("Smallest input rainfall: " + str(minRainfall))

试用具有上述更改的完整程序 here.

用法示例:

How many years do you want to track:  1
Inches of rainfall for month 1 | year 1:  2
Inches of rainfall for month 2 | year 1:  2
Inches of rainfall for month 3 | year 1:  2
Inches of rainfall for month 4 | year 1:  2
Inches of rainfall for month 5 | year 1:  4
Inches of rainfall for month 6 | year 1:  1
Inches of rainfall for month 7 | year 1:  2
Inches of rainfall for month 8 | year 1:  2
Inches of rainfall for month 9 | year 1:  2
Inches of rainfall for month 10 | year 1:  2
Inches of rainfall for month 11 | year 1:  2
Inches of rainfall for month 12 | year 1:  2
Total months: 12
Total rain: 25 (inch)
Total average rainfall: 2.08 (inch)
Largest input rainfall: 4
Smallest input rainfall: 1

N.B. 我只使用了 camelCase in naming the new variables as that is the style you are using. I would recommend changing all the names of the variables in your program to snake_case 因为这是 python.[=17 中的约定=]

Python 的内置 min() 和 max() 函数期望像 list、set 等可迭代对象。我想你只放了一个不太正确的整数(当只给定 1 个数字时,你如何选择最小或最大数字 - 显然它是 bot min 和 max)。 一种方法是:

  1. 声明列表变量:

    rainfallList = []

  2. 然后当你得到monthlyRainfall时,你应该添加这个代码:

    rainfallList.append(monthlyRainfall)

  3. 毕竟for循环你可以使用min(rainfallList) and/or max(rainfallList)

所以你的最终代码应该是:

def yearsToTrack():
    userYearsTracking = int(input("How many years do you want to track: "))
    return userYearsTracking

def calculationAlgorithm(userYearsTracking):
    totalMonths = 0
    totalRainfall = 0

    rainfallList = []

    for currentYear in range (1, userYearsTracking +1):
        for currentMonth in range (1, 13):
            monthlyRainfall = int(input("Inches of rainfall for month " + format(currentMonth, "d",) + " | year " +
                                    format(currentYear, "d",)+": "))
            totalMonths += 1
            rainfallList.append(monthlyRainfall)

            totalRainfall += monthlyRainfall
    averageRainfall = totalRainfall / totalMonths
    print("Total months: " + str(totalMonths))
    print("Total rain:", format(totalRainfall), "(inch)")
    print("Total average rainfall:", round(averageRainfall,2), "(inch)")
    print("Min rain:", format(min(rainfallList)), "(inch)")
    print("Max rain:", format(max(rainfallList)), "(inch)")

def main():
    userYearsTracking = yearsToTrack()
    calculationAlgorithm(userYearsTracking)
main()