def checkGrade(raw):
''' (int) -> object (i.e., int OR str)
Assign grade from raw score
>>> checkGrade(74)
3
>>> checkGrade(82)
4
>>> checkGrade(-5)
'Error, raw score exceed min score'
>>> checkGrade(210)
'Error, raw score exceed max score'
'''
if raw>100:
score = "Error, raw score exceed max score"
elif raw>80:
score = 4.00
elif raw>70:
score = 3.00
elif raw>60:
score = 2.00
elif raw>50:
score = 1.00
elif raw>0:
score = 0
else:
score = "Error, raw score exceed min score"
return score
现在我想做这样的事情(显示在docstring中):
def calGPA(n):
''' (str) -> float
Take all the raw scores, limited to 10 subjects, and
calculate GPA. Raw scores must be in range of 0 - 100.
>>> calGPA("77 45 77 55 87")
2.2
>>> calGPA("66 67 45 89")
2.0
>>> calGPA("87 91 84 89")
4.0
>>> calGPA("87 91 84 103")
'Error'
>>> calGPA("77 45 77 55 87 21 35 65 98 12 23 45")
'Error'
'''
原始标记输入是以空格分隔的字符串。如何从这样的输入中使用checkGrade()
函数计算GPA?我试过这个:
map(int, s.split())
但它不起作用。
已修改为添加新要求
如果我想将所有输入更改为calGPA("A B C D F")
而非calGPA("80 70 63 55 40")
之类的字母,并且输入包含除“A”,“B”,“C”,“D”之外的任何内容, “F”如calGPA("A C B Z S")
则输出应为“错误”。如果元素不是“A”,“B”,“C”,“D”,“F”之一,我该怎么办才能获得“错误”?
答案 0 :(得分:1)
简单地将字符串中的所有项目转换为整数,然后将函数应用于每个类似的数字
checkGPA = lambda data: map(checkGrade, map(int, data.split())) # apply the function to int
答案 1 :(得分:0)
CalGPA(int(x) for x in s.split())
将有效。
答案 2 :(得分:0)
您需要拆分包含原始标记的字符串,然后使用checkGrade
函数获取该原始标记的分数。试试这个:
def checkGrade(raw):
if raw>100:
score = "Error, raw score exceed max score"
elif raw>80:
score = 4.00
elif raw>70:
score = 3.00
elif raw>60:
score = 2.00
elif raw>50:
score = 1.00
elif raw>0:
score = 0
else:
score = "Error, raw score exceed min score"
return score
def calGPA(s):
raw_marks = s.split()
num_subjects = len(raw_marks)
if num_subjects > 10:
print('Limit for number of subjects exceeded')
return
total = 0
for raw in raw_marks:
total += checkGrade(int(raw))
print('GPA: {}'.format(total/num_subjects))
calGPA("77 45 77 55 87")
输出:
GPA 2.2
修改以反映您的新要求
def calGPA(s):
gpas = s.split()
valid_grades = ['A', 'B', 'C', 'D', 'F']
if not all(gpa in valid_grades for gpa in gpas):
print("Error")
PS:编辑问题的方式是使当前接受的答案无效不允许
答案 3 :(得分:0)
使用此:
def calGPA(n):
iter = map(int, n.split())
return sum(checkGrade(x) for x in iter)/len(iter) if len(iter)<10 and all(el <100 for el in iter) else 'Erreur'
all(el <100 for el in iter
会检查iter
中的所有元素是否在0-100
范围内。如果一个元素超出范围,它将返回False
。