繁体   English   中英

计算Python的平均成绩?

[英]Calculating the average grade in Python?

我试图获得两个及格分数的平均值。 输出应为:

  • 如果两个年级都不是及格分数均小于50,则为0.0
  • 及格分数,如果只有其中一个分数为及格分数(如果> 50)
  • 如果两个年级均为及格成绩(如果两个均大于50),则为两个年级的平均值

到目前为止,这是我的代码:

def passing_grade(grade1,grade2):
    '''(number, number)--> number
    This function definition prints the average of all passing grade(s)
    '''
    # Function 1 - If both numbers are outside the grading range (0-100)
    if 0.0 < grade1 > 100.0 and 0 < grade2 > 100.0:
           print ('Not available grading')

    elif 0.0 >= grade1 <= 50.0 and 0.0 >= grade2 <= 50.0:
            print (0.0)

    #Function 2 - If one of the grades is passing then, print passing grade
    elif 0.0 >= grade1 <= 50.0 and 0.0 >= grade2 >= 50.0:
        print (grade2)
    elif 0.0 >= grade1 >= 50.0 and 0.0 >= grade2 <= 50.0:
        print (grade1)

    #Function 3 - If both grades are passing >50 then print the average
    elif 50.0 > grade1 <= 100.0 and 50.0> grade2 <= 100.0:
        print ((grade1+grade2)/2)

由于您尚未指定,我只是在这里猜测您的问题,但是在“功能2”的第二部分中看起来您的逻辑不好:

elif 0.0 >= grade1 <= 50.0 and 0.0 >= grade2 >= 50.0:
    print (grade2)
elif 0.0 >= grade1 >= 50.0 and 0.0 >= grade2 <= 50.0:
    print (grade1)

应该:

elif grade1 <= 50.0 and grade2 >= 50.0:
    print (grade2)
elif grade1 >= 50.0 and grade2 <= 50.0:
    print (grade1)

如果您查看原始条件,则继续检查0.0 >= gradeN ,这意味着仅当等级为负数时才为true。 您的其他某些部分也存在类似的问题。

您的比较搞砸了。 他们没有说您的意思,而且许多人总是认为False。 不能存在等级1使得0.0 >= grade1 >= 50.0 ,因为不存在大于等于50的非正数。我建议您“漫长的路途”写出多个比较,直到您清楚要说的是什么,而不是使用Python的这种节省按键功能的功能。 在Python中, a < b < c表示a < b and b < c而不是a < b or b < c ,这是您要在第一个“ if”语句中说的形式。

最后,在一个表达式中编写多个比较时,不要混淆比较的方向,这无疑会造成混淆(对您而言,从一开始)。

一种更简洁的函数编写方法(计算的一部分):

def avg_passing_grade(grade1, grade2):
    passing_grades = [g for g in (grade1, grade2) if 50 <= g <= 100]
    return sum(passing_grades)/max(1, len(passing_grades))

这将使列表passing_grades仅包含提供给通过的函数的等级。 该函数返回其平均值,请注意不要在不通过任何等级的情况下将其除以0。

尽管以下内容可能会过大,但我不得不提一下它:在上面的函数可以轻松地概括为需要任意等级的分数:

def average_passing_grade(* grades):
    '''Return the average of the passing grades among grades.'''
    passing_grades = [g for g in grades if 50 <= g <= 100]
    return sum(passing_grades)/max(1, len(passing_grades))

您可以这样使用:

>>> average_passing_grade()
0.0
>>> average_passing_grade(35.3)
0.0
>>> average_passing_grade(75.5)
75.5
>>> average_passing_grade(35.3, 88)
88.0
>>> average_passing_grade(88, 20)
88.0
>>> average_passing_grade(50, 100)
75.0
>>> average_passing_grade(40, 50, 60, 70, 80, 90)
70.0

除了其他答案中指出的不良逻辑之外,您还可以使用max和min对某些情况进行一次逻辑检查。

if grade1 >= 50.0 and grade2 >= 50.0: 

if min (grade1, grade2) >= 50.0: # Both are >= 50.0

同样

if  max(grade1, grade2) < 50.0 # both are less than 50.0

一旦这两个显示为假,则else表示在限制的每一侧。

同样,要测试无效值,您可以使用

if max(grade1, grade2) > 100.0 or min(grade1, grade2) < 0:

表示至少一个等级无效

if min(grade1, grade2) > 100 or max(grade1, grade2) <0:

表示两个等级都以相同的方式无效。

我不是Python专家。 但是,我很确定您的错误是由于您的if条件造成的。

    if 0.0 < grade1 > 100.0 and 0 < grade2 > 100.0:

应该是这样的

    if (grade1 < 0 or grade1 > 100) and (grade2 < 0 or grade2 > 100):

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM