计算Python的平均成绩?

时间:2014-03-17 15:50:13

标签: python

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

  • 0.0如果两个等级都不是合格等级<50
  • 通过成绩,如果只有一个成绩是及格分数(如果 一个是> 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)

4 个答案:

答案 0 :(得分:2)

我只是在这里猜测你的问题,因为你还没有指定,但在#34;功能#2&#34;的第二部分看起来你的逻辑错误:

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,这意味着只有等级为负数才会生效。你的其他一些部分也存在类似的问题。

答案 1 :(得分:2)

你的比较搞砸了。他们不会说出你的意思,许多人总是评价为False。可能没有等级1,0.0 >= grade1 >= 50.0,因为没有非正数的大于等于50.我建议你写出你的多重比较&#34;漫长的方式&#34;直到你清楚自己的意思,而不是使用Python的这种击键保存功能。 Python中的a < b < c表示a < b and b < c而不是a < b or b < c,这是您想要在第一个&#39; if&#39;言。

最后,当在一个表达式中编写多个比较时,不要混淆比较的方向,它会不必要地混淆(对你而言,开始)。

一种更简洁的写作方式(计算部分):

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

答案 2 :(得分:1)

除了在其他答案中指出的错误逻辑之外,您还可以使用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

一旦这两个被显示为false,则else表示一个位于限制的每一侧。

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

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

表示至少有一个成绩无效

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

意味着两个等级都以同样的方式无效。

答案 3 :(得分: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):