2016-03-29 6 views
0

Ich möchte Python 10 Fragen stellen und ein Benutzer ihre Antworten eingeben müssen, die funktioniert. Ich möchte aber auch, dass Python mit dem folgenden Code sagt, ob das korrekt ist oder nicht, aber das geht nicht und nur zur nächsten Frage. Kann mir jemand sagen warum? Oder was muss ich ändern? Auch wie stelle ich 10 Fragen speziell mit den Variablen, die ich habe und eine while-Schleife?Python: Wie python eine Summe berechnen, um sicherzustellen, dass eine Eingabe korrekt ist?

import time 
import random 
question = 0 
score = 0 
name = input("What is your full name?") 
print ("Hello " + name, "welcome to The Arithmetic Quiz") 
time.sleep(2) 
operand1 = list(range(2, 12)) 
operators = ["+"] 
operand2 = list(range(2, 12)) 

while question < 10: 
    user_answer=int(input(str(random.choice(operand1)) + random.choice(operators) + str(random.choice(operand2)))) 
    if operators=='+': 
     expected_answer==operand1 + operand2 
     if user_answer==expected_answer: 
      print('This is correct!') 
      score = score + 1 
      question = question + 1 
      time.sleep(2) 
     else: 
      print('This is incorrect!') 
      question = question + 1 
      time.sleep(2) 
+0

Ich nehme an, basierend auf der Art und Weise, "Eingabe" verwendet wird, dass dies Python 3 ist? – Kupiakos

+0

@Kupiakos Ja, es ist – Ikr

Antwort

2

Alle Ihre Vergleiche in Ihrer while Anweisung werden gegen list s getan anstelle des zufällig ausgewählten Elements.

Sie wollen wahrscheinlich etwas tun:

operands1 = list(range(2, 12)) 
operators = ["+"] 
operands2 = list(range(2, 12)) 

while question < 10: 
    operand1 = random.choice(operands1) 
    operand2 = random.choice(operands2) 
    operator = random.choice(operators) 
    user_answer = int(input('{} {} {} '.format(operand1, operator, operand2))) 
    if operator == '+': 
     expected_answer = operand1 + operand2 
     if user_answer == expected_answer: 
      print('This is correct!') 
      score = score + 1 
      question = question + 1 
      time.sleep(2) 
     else: 
      print('This is incorrect!') 
      question = question + 1 
      time.sleep(2) 

Es gibt viele andere Möglichkeiten, um die Struktur des Codes zu verbessern, was könnte es so aussehen:

import operator as ops 
import time 
import random 

NUM_QUESTIONS = 10 
OPERANDS = list(range(2, 12)) 
OPERATORS = {'+': ops.add, '-': ops.sub, '*': ops.mul} 

def getInteger(prompt, errormsg='Please input an integer'): 
    while True: 
     try: 
      return int(input(prompt)) 
     except ValueError: 
      print(errormsg) 

def main(): 
    question = score = 0 

    name = input('What is your full name? ') 
    print('Hello {}, welcome to The Arithmetic Quiz'.format(name)) 
    time.sleep(2) 

    for _ in range(NUM_QUESTIONS): 
     operand1 = random.choice(OPERANDS) 
     operand2 = random.choice(OPERANDS) 
     operator = random.choice(list(OPERATORS)) 

     user_answer = getInteger('{} {} {} '.format(operand1, operator, operand2)) 
     expected_answer = OPERATORS[operator](operand1, operand2) 
     if user_answer == expected_answer: 
      print('This is correct!') 
      score += 1 
     else: 
      print('This is incorrect!') 
     time.sleep(2) 

if __name__ == '__main__': 
    main() 

Diese Anwendungen eine dedizierte getInteger-Funktion, um ungültige Eingaben zu verarbeiten, verwendet ein Wörterbuch und Funktionen als erstklassige Objekte, um auszuwählen, welche "tatsächliche" Operatorfunktion zu verwenden ist, verwendet stattdessen +=, verwendet range und for einer while Schleife, verwendet vernünftige Konstanten ... die Liste der möglichen Verbesserungen ist groß.

+0

Für mich heißt es der Doppelpunkt ist ungültige Syntax für if Operator == '+': – Ikr

+0

@Ikr Es ist alles jetzt behoben. – Kupiakos

0

Hier ist, was mit dem Code falsch war

import time 
import random 
question = 0 
score = 0 
name = input("What is your full name?") 
print ("Hello " + name, "welcome to The Arithmetic Quiz") 
time.sleep(2) 
operand1 = list(range(2, 12)) 
#Choice works fine with ranges 
#No need to transform it with a list 
operators = ["+"] 
operand2 = list(range(2, 12)) 
#Using the for loop is more Pythonic 
while question < 10: 
    user_answer=int(input(str(random.choice(operand1)) + random.choice(operators) + str(random.choice(operand2)))) 
    if operators=='+': ##Over here you were comparing a list to a str 
     expected_answer==operand1 + operand2 ##This is a boolean operator not an int value 
     if user_answer==expected_answer: 
      print('This is correct!') 
      score = score + 1 
      question = question + 1 
      time.sleep(2) 
     else: 
      print('This is incorrect!') 
      question = question + 1 
      time.sleep(2) 

Wie Kupiakos sagte, gibt es eine Menge Möglichkeiten, den Code und die er bereits abgedeckt meisten von ihnen zu optimieren. Ich werde auf Fixes für die genannten Probleme hinweisen.

import time 
from random import choice, randint 
question, score = 0, 0 

name = input("What is your full name?\n>>> ") 
print ("Hello {} welcome to The Arithmetic Quiz\n".format(name)) 
time.sleep(2) 

for _ in range(10): 
    operand1, operand2 = [randint(2, 12) for _ in range(2)] 
    op = choice(['+'])##You have to store the value so that you can compare it later 
    user_answer=int(input('{0}{2}{1}\n>>> '.format(operand1, operand2, op))) 
    if op == '+': 
     expected_answer = operand1 + operand2 
     if user_answer == expected_answer: 
      print('This is correct!') 
      score += 1 
      question += 1 
      time.sleep(2) 
     else: 
      print('This is incorrect!') 
      question = question + 1 
      time.sleep(2) 
print('Your score is: {} points'.format(score)) 

Viel Glück mit Ihren Schülern.

+0

Was meinst du mit ## Hier hast du eine Liste mit einer str verglichen? – Ikr

+0

Wie ändere ich auch expected_answer == operand1 + operand2? – Ikr

+0

['+'] gehört zur Listenklasse, während, wenn Sie ein zufälliges Element daraus auswählen, dieses Element ein str ist. Ihre Bedingungen waren '[' + '] ==' + ', die immer falsch zurückgeben, weil sie zu verschiedenen Klassen gehören. Wenn Sie 'type()' auf beiden verwenden, werden Sie sehen, was ich meine. @lkr – iDrwish

0

Im Folgenden finden Sie die Lösung für Ihr Problem:

import time 
import random 

question = 0 
score = 0 
name = input("What is your full name?") 
print ("Hello " + name, "welcome to The Arithmetic Quiz") 
time.sleep(2) 
operand1 = list(range(2, 12)) 
operand2 = list(range(2, 12)) 

while question < 10: 
    num1 = random.choice(operand1) 
    num2 = random.choice(operand2) 
    print(str(num1) + "+" + str(num2)) 
    user_answer = int(input()) 
    expected_answer = int(num1) + int(num2) 
    if user_answer == expected_answer: 
     print('This is correct!!') 
     score = score + 1 
     question = question + 1 
    else: 
     print('This is incorrect!!') 
     question = question + 1 

print("\nYour score is " + str(score)) 

Die Operanden Variable ist hier nicht erforderlich, stattdessen können Sie den Operator + als String selbst übergeben. Auch die expected_answer -Variable kann die Summierung nicht auflösen, da operand1 und operand2 als Liste, aber nicht als int übergeben werden.

Verwandte Themen