简体   繁体   English

Python:如何使python计算总和以确保输入正确?

[英]Python: how to make python calculate a sum to make sure an input is correct?

I want to make python ask 10 questions and a user to have to input their answers which works. 我想让python提出10个问题,并且用户必须输入有效的答案。 However I also want python to say whether this is correct or not by using the code below but this does not work and only moves onto the next question. 但是我也想让python通过使用下面的代码来说这是否正确,但这是行不通的,只会进入下一个问题。 Could anybody tell me why? 有人可以告诉我为什么吗? Or what I need to change? 还是我需要改变? Also how do I make this ask 10 question specifically using the variables I have and a while loop? 另外,如何使用我拥有的变量和while循环使这个问题10变得特别?

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)

All of your comparisons in your while statement are being done against list s instead of the randomly chosen element. while语句中的所有比较都是针对list而不是针对随机选择的元素进行的。

You likely want to do something like this: 您可能想要执行以下操作:

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)

There are many other ways to improve the structure of the code, which might make it look like this: 还有许多其他方法可以改善代码的结构,这可能会使代码看起来像这样:

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()

This uses a dedicated getInteger function to handle invalid input, uses a dictionary and functions being first-class objects to choose which "actual" operator function to use, uses += , uses range and for , instead of a while loop, uses sane constants...the list of possible improvements is large. 这使用专用的getInteger函数来处理无效输入,使用字典和作为第一类对象的函数来选择要使用的“实际”运算符函数,使用+= ,使用rangefor ,而不是while循环,使用合理的常量...可能的改进清单很大。

Here is what was wrong with the code 这是代码的错误

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)

As Kupiakos said, there is a lot of ways to optimize the code and he already covered most of them. 正如Kupiakos所说,有很多方法可以优化代码,而他已经介绍了大多数方法。 I will point out to fixes for the mentioned problems. 我将指出解决上述问题的方法。

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))

Good luck with your students. 祝你学生好运。

Below is the solution to your 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))

The operands variable is not required here, instead you can pass the + operator as a string itself. 这里不需要操作数变量,而是可以将+运算符本身作为字符串传递。 Also expected_answer variable is not able to resolve the summation as operand1 and operand2 are being passed as a list but not as an int. 另外,由于将操作数1和操作数2作为列表而不是整数进行传递,expected_answer变量也无法解析求和。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM