1

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

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

这让我很困惑(我是新手),我可以使用一些帮助。

4

5 回答 5

9

你的问题是这样的:

if   z >= 0 or z <= 59:

利用:

if 0 <= z <= 59:

这减轻了您使用的问题orand并且更具可读性。

但是你应该看看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']
于 2013-06-03T23:18:14.613 回答
2

or的 s ingrader应该是ands。您输入的任何大于 0 的内容都将通过第一个条件,F 也是如此。

于 2013-06-03T23:19:54.207 回答
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'))
于 2013-06-03T23:22:23.557 回答
0

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

你把 ors 和 ands 混淆了

if x>0 and x < 59只是从 0 到 59 的范围

但可以更简洁 0 < x < 59

于 2013-06-03T23:19:44.397 回答
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"
于 2017-04-02T16:46:44.297 回答