Número entero de Python a letra

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:

  1. no es necesario configurar while1 = True una y otra vez.
  2. 0 es una entrada válida en su código, pero el texto dice que las calificaciones válidas comienzan en 1.

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"