Estoy intentando solucionar los errores en este fragmento de código:
import time while1 = True def grader (z): if z >= 0 or z = 60 or z = 62 or z = 67 or z = 70 or z = 73 or z = 77 or z = 80 or z = 83 or z = 87 or 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 100: print "Between 1 and 100 PLEASE!\n" while1 = True print grader(z) print "New number now\n" time.sleep(100) while1 = True
El argumento en esta situación es el entero z
. z
usuario establece el valor de z
y luego la función debería cambiar y determinar el valor de la letra z
, independientemente de lo que, sin embargo, siempre devuelve ‘F’.
Esto es bastante confuso para mí (soy un novato) y podría necesitar algo de ayuda.
Tu problema es este:
if z >= 0 or z <= 59:
Utilizar:
if 0 <= z <= 59:
Esto alivia el problema que está usando or
lugar de y es más legible.
Pero deberías mirar el módulo 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']
Tu or
s en el grader
deben ser and
s. Cualquier cosa que ingrese que sea mayor que 0 pasará el primer condicional, y así será una F.
Basado en la respuesta (excelente) de @Jon Clements, pero creo que es más fácil de entender:
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'))
if x>0 or x < 59
cubrirá todo sobre 0
estas confundiendo a los ors con los ands
if x>0 and x < 59
es solo el rango de 0 a 59
pero puede ser más breve como 0 < x < 59
Esto ha sido resuelto hace mucho tiempo, pero quedan algunos puntos:
while1 = True
una y otra vez. Una solución completa, combinada con la gran respuesta de @Jon Clement , sería
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"