Python整数到字母等级问题

时间:2013-06-03 23:17:00

标签: python if-statement comparison

我正在尝试解决这段代码中的错误:

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'。

这对我来说相当迷惑(我是新手),我可以使用一些帮助。

5 个答案:

答案 0 :(得分:8)

你的问题是:

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']

答案 1 :(得分:2)

or中的grader应为and。您输入的任何大于0的内容都将传递第一个条件,因此将是F。

答案 2 :(得分:1)

基于@Jon Clements'(伟大的)答案,但我认为更容易理解:

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'))

答案 3 :(得分:0)

if x>0 or x < 59将覆盖0以上的所有内容

你和os混淆了

if x>0 and x < 59的范围仅为0到59

但可以更简洁 0 < x < 59

答案 4 :(得分:0)

这一点早已解决,但仍有几点:

  1. 无需一次又一次地设置while1 = True
  2. 0是代码中的有效输入,但文本显示有效成绩从1开始。
  3. 完整的解决方案与@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"