Generando preguntas de matemáticas al azar

Mi tarea es producir un código que salude al usuario y le pida a su nombre que almacene su nombre como nombre de username . Luego genera 2 números aleatorios y una operación. La pregunta se hace al usuario. Después de eso, comprueba si la respuesta de los usuarios es correcta o no agrega 1 a las questionsAsked . Si es correcto, se agrega 1 a correctAnswers . Si es incorrecto, se le dice al usuario con la respuesta correcta. El progtwig debe finalizar después de 10 preguntas (por lo tanto, while questionAsked > 11 ). El usuario debe recibir su username y la cantidad de preguntas que recibió correctamente.

Mi problema es que cuando ejecuto el código, aparece NameError: name 'questionAsked' is not defined . Estoy luchando para averiguar de qué otra manera podría definir la questionAsked .

Esto es lo que he hecho hasta ahora:

 import random import math def test(): Username=input("What is your name?") print ("Welcome"+Username+" to the Arithmetic quiz") num1=random.randint(1, 10) num2=random.randint(1, 10) Ops = ['+','-','*'] Operation = random.choice(ops) num3=int(eval(str(num1) + operation + str(num2))) print("What is" +" "+str(num1) + operation +str (num2,"?")) userAnswer= int(input("Your answer:")) if userAnswer != num3: print("Incorrect. The right answer is"+" "+(num3)) return False else: print("correct") return True correctAnswers=0 questionsAsked=0 while questionAsked > 11: if test () == True: questionsAnswered +=1 correctAnswers +=1 if test () == False: questionsAnswered +=1 

Tienes una prueba while questionAsked > 11 pero no usas ese nombre en ningún otro lugar de tu código. Ciertamente nunca lo definiste. Probablemente quiso probar las questionsAsked hicieron (con una s ) en su lugar.

Hay otros problemas, sin embargo. El bucle debe continuar mientras tiene menos de 11 preguntas, no más. También llama a test() dos veces, solo debe llamarlo una vez en cada bucle. En su bucle, usted usa questionsAnswered pero nunca definió eso tampoco y no incrementó las questionsAsked ; probablemente quisiste incrementar este último:

 correctAnswers=0 questionsAsked=0 while questionsAsked < 10: if test(): correctAnswers +=1 questionsAsked +=1 

Ahora test() solo se llama una vez. Sus dos questionsAsked incrementaron sus questionsAsked Pregunté, lo eliminé de las pruebas y ahora ya no necesita verificar si la prueba falló.

Ya que comienza a contar a cero , quiere probar para < 10 , no 11 .

En lugar de un bucle while, podría usar un bucle for utilizando la función range() :

 for question_number in range(10): if test(): correctAnswers +=1 

Ahora el bucle for se encarga de contar la cantidad de preguntas formuladas y ya no es necesario incrementar una variable manualmente.

A continuación, debe mover el username maneja fuera de la función test() . No es necesario que le preguntes al usuario su nombre cada vez. Pida el nombre una vez, antes del bucle, para que pueda acceder al nombre del usuario después de las 10 preguntas:

 def test(): num1=random.randint(1, 10) num2=random.randint(1, 10) # ... etc. Username = input("What is your name?") print("Welcome", Username, "to the Arithmetic quiz") correctAnswers = 0 for question_number in range(10): if test(): correctAnswers +=1 # print the username and correctAnswers 

También debe tener cuidado con sus nombres en la función test() ; usted define los nombres Ops y Operation pero trata de usarlos como ops y operation . Eso no funcionará, debe usar el mismo caso en todas partes para referirse a esos nombres. La guía de estilo de Python recomienda usar todo en minúsculas con guiones bajos para los nombres locales, para distinguirlos de los nombres de clase (que usan CamelCase, letras mayúsculas iniciales y sin espacios entre las palabras).

Problema siguiente: estás usando str() con dos argumentos aquí:

 print("What is" +" "+str(num1) + operation +str (num2,"?")) 

Eso no funcionará; una llamada str() dos argumentos está destinada a decodificar bytes en una cadena Unicode.

En lugar de usar la concatenación de cadenas, simplemente pase sus valores a print() como argumentos separados. La función se encargará de convertir las cosas en cadenas y agregará espacios entre argumentos separados para usted:

 print("What is", num1, operation, num2, "?") 

Ahora habrá un espacio entre num2 y el "?" Pero eso no es un gran problema. Puede usar el método str.format() para crear una cadena con marcadores de posición donde los argumentos del método se completan por usted, convirtiéndose nuevamente en cadenas automáticamente. Esto le permite controlar espacios más directamente:

 print("What is {} {} {}?".format(num1, operation, num2)) 

Los tres argumentos se colocan donde aparece cada {} , en orden.

Tienes muchas discrepancias en nombres de variables y sangría. Recuerde que Python distingue entre mayúsculas y minúsculas. Y, por cierto, la condición en su bucle while hará que su progtwig no haga preguntas.

Entonces, por ejemplo, creó una lista de operaciones llamada Ops y luego usó el módulo aleatorio para seleccionar una operación de ops . Python inevitablemente arrojará un error, ya que las ops no están definidas. En su lugar, debe usar Ops porque esa es la variable que realmente declaró, con una letra mayúscula. Una vez más, Python distingue entre mayúsculas y minúsculas.

Del mismo modo, Python reconoce una diferencia entre questionAsked y questionsAsked . Es uno u otro, así que elige un nombre y sé coherente.