我想获得两个及格分数的平均分。输出应为:
到目前为止,这是我的代码:
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)
答案 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):