2016-02-26 43 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

相關問題