2013-06-03 111 views
1

我試圖在這一段代碼來解決該錯誤:Python的整數字母等級問題

import time 

while1 = True 

def grader (z): 
    if z >= 0 or z <= 59: 
     return "F" 
    elif z >= 60 or z <= 62: 
     return "D-" 
    elif z >= 62 or z <= 66: 
     return "D" 
    elif z >= 67 or z <= 69: 
     return "D+" 
    elif z >= 70 or z <= 62: 
     return "C-" 
    elif z >= 73 or z <= 76: 
     return "C" 
    elif z >= 77 or z <= 79: 
     return "C+" 
    elif z >= 80 or z <= 82: 
     return "B-" 
    elif z >= 83 or z <= 86: 
     return "B" 
    elif z >= 87 or z <= 89: 
     return "B+" 
    elif z >= 90 or z <= 92: 
     return "A-" 
    else: 
     return "A" 



while while1: 
    z = int(input("I will tell you the grade of this number, enter from 1 - 100\n")) 
    if z < 0 or z > 100: 
     print "Between 1 and 100 PLEASE!\n" 
     while1 = True 
    print grader(z) 
    print "New number now\n" 
    time.sleep(100) 
    while1 = True 

在這種情況下的參數是整數zz的值由用戶設置,然後函數應該擺動並確定什麼字母等級z是值得的,不管它總是返回'F'。

這對我來說很困惑(我是新手),我可以使用一些幫助。

+2

代碼審查挑剔:如果某人使用錯誤的分級,他們得到一個答案。如果輸入不在1和100之間,你應該拋出一個錯誤或者返回其他東西。 – djechlin

+2

'z> = 90或z <= 92'應該使用'和',並且一旦校正可以表示爲'90 <= z <= 92'。 –

+1

在返回時,不需要elif。 '如果z <= 59'等就足夠了。 – Elazar

回答

7

你的問題是這樣的:

if z >= 0 or z <= 59: 

用途:

if 0 <= z <= 59: 

這減輕你使用or代替and擁有和更具有可讀性的問題。

但是你應該看看bisect模塊:

>>> def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'): 
     i = bisect(breakpoints, score) 
     return grades[i] 

>>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] 
['F', 'A', 'C', 'C', 'B', 'A', 'A'] 
+0

我懷疑這是一項任務而不是現實生活......我懷疑教會採取對分的解決方案...但是是一切都一樣 –

+0

@JoranBeasley好 - 它來自文檔,所以我希望學生有望閱讀那些;) –

+1

我認爲你應該注意可變的默認參數,或者簡單地使用'tuple'。 – Elazar

0

if x>0 or x < 59將涵蓋一切在0

你是ANDS

if x>0 and x < 59混亂ORS只能從0到59

範圍

但可以更簡潔 0 < x < 59

+0

那是'<='。無論如何,可能會更好地圍繞它 - '<60' – Elazar

+0

我不擔心範圍如此多概念...... –

+0

是的,但讀者可能不知道它。 – Elazar

2

您的or s在grader應該是and s。任何你輸入大於0將通過第一個條件,因此將是一個F.

+1

直接回答爲什麼它總是一個'F' +1 –

1

基於@喬恩克萊門茨(偉大的)答案,但我認爲更容易已瞭解:

def grade(score, breakpoints, grades): 
    for k, v in zip(breakpoints, grades): 
     if score > k: 
      return v 
    return 'Error' 

grade(score, breakpoints=(90, 80, 70, 60, 0), grades=('A','B','C','D','E','F')) 
+0

你應該分辨這些子等級,例如'A +'vs'A' vs'A-'。 –

+0

@MarcLaugharn這太冗長了。但是用元組可以很容易地擴展它。 – Elazar

0

這個問題早已解決,但仍有幾點:

  1. 無需一次又一次設置while1 = True
  2. 0是在你的代碼中的有效輸入,但文本說,有效的成績從1開始

一個完整的解決方案,結合@Jon Clement's great answer,將

import time 
from bisect import bisect 

def grader(score, 
      breakpoints=[60, 62, 67, 70, 73, 77, 80, 83, 87, 90, 93], 
      grades=['F', 'D-', 'D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 
        'A']): 
     i = bisect(breakpoints, score) 
     return grades[i] 

while True: 
    z = int(input("I will tell you the grade of this number, enter from 1 - 100\n")) 
    if z < 0 or z > 100: 
     print "Between 0 and 100 PLEASE!\n" 
     continue 
    print grader(z) 
    time.sleep(100) 
    print "New number now\n"