2016-02-26 41 views
0
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 

现在我想要做这样的事情(在文档字符串中):如何计算Python 2.7中以空格分隔的多个输入?

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

请格式化您的代码,并给出比“不行”更好的错误说明。 – timgeb

+0

使用'raws'作为参数名称而不是'raw'。然后,为map(int,raws.split()):raw创建一个'for'循环:'。缩进代码的其余部分,使其位于'for'循环中。 – zondo

+0

我不认为在这种情况下使用'raw'作为变量名是一个问题。 –

回答

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:以这样的方式编辑问题,它使目前接受的答案无效为不允许非常气馁。

+0

这可以帮助我很多,谢谢。 –

+0

如果我想将所有输入改为calGPA(“ABCDF”)而不是calGPA(“80 70 63 55 40”),而“A”,“B”,“C”,“D”,“ F“,如calGPA(”ACBZS“),那么输出应该是”错误“。我该怎么办? –

+0

无论如何,谢谢你,抱歉编辑我会记得的问题。 –

1

可简单地把所有项目的字符串为整数。随后将功能应用到每个铸造数量,像这样

checkGPA = lambda data: map(checkGrade, map(int, data.split())) # apply the function to int 
0

CalGPA(int(x) for x in s.split())会工作。

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如果一个元素超出范围。

+1

谢谢,我在这里学到了一些新东西。 –

+0

如果我想将所有输入改为calGPA(“ABCDF”)而不是calGPA(“80 70 63 55 40”),而“A”,“B”,“C”,“D”,“ F“,如calGPA(”ACBZS“),那么输出应该是”错误“。我应该如何处理所有的问题(如果一个元素不是“A”,“B”,“C”,“D”,“F”),为了得到“错误”,el中的el <100。 –

+0

@MrMaster_P定义' EXCLUDE =(“A”,“B”,“C”,“D”,“F”)'然后使用'all(el不在EXCLUDE中) – Zety