Тот же оператор используется даже после выбора другого

#python #python-2.x

#python #python-2.x

Вопрос:

Код использует оператор, который был выбран в предыдущем воспроизведении, даже после выбора другого оператора после повторного воспроизведения.

Я снова проверил функции и все еще не могу найти, в чем именно проблема.

 import random

print "Welcome!"

def get_choice():
    print "What are we practicing? n1. Addition ( ) n2. Subtraction (-) n3. Multiplication (*) n4. Division (/)"

    option = raw_input('> ')

    while option != ' ' and option != '-' and option != '*' and option != '/':
        print "You typed %r which is not valid. Please enter ' , -, *,or /'" %(option)
        option = raw_input('>')
    return option

operation = get_choice()

def ask_question (operation):
    numbers = []
    for y in range(0,2):
        x = random.randint(1,100)
        numbers.append(x)
    num1 = numbers[0]
    num2 = numbers[1]
    print num1, operation, num2
    response = int(raw_input('>'))
    return num1, num2, response

num1, num2, response = ask_question(operation)

def check_response(response):
    if operation == ' ':
        answer = num1   num2
    elif operation == '-':
        answer = num1 - num2
    elif operation == '*':
        answer = num1 * num2
    else:
        answer = num1 / num2

    i = 0
    if response == answer:
        print "Correct!"
    elif response != answer:
        while i < 2:
            print "Wrong! Try again: n%r   %r" %(num1, num2)
            i  = 1
            response = raw_input()
            if response != answer and i >= 2:
                print "Sorry. You run out of chances."

check_response(response)

def repeat():
    while True:
        print "Do you want to play again?"
        again = raw_input('>')
        if again == 'y' or again == 'Y':
            get_choice()
            ask_question(operation)
            check_response(response)
        else:
            break   
repeat()
 

Добро пожаловать! Что мы практикуем?

  1. Сложение ( )
  2. Вычитание (-)
  3. Умножение (*)
  4. Разделение (/)
      *

18 * 4

72 Правильно! Вы хотите снова поиграть?

y

Что мы практикуем?

  1. Сложение ( )
  2. Вычитание (-)
  3. Умножение (*)
  4. Разделение (/)

94 * 83

Комментарии:

1. При первом вызове get_option() вы присваиваете результат глобальной переменной operation . Когда вы вызываете его снова, вы игнорируете возвращаемое значение. Вы также игнорируете возвращаемое значение ask_question .

Ответ №1:

Причина , по которой он застревает на одной операции , заключается в том , что вы не улавливаете никакого возвращаемого значения get_choice() при вызове его внутри repeat() . Я настроил raw_input() to input() , чтобы заставить его работать (я на python 3.X, и вам также следует обновить, поскольку 2.X будет прекращен в этом году!), И, похоже, сейчас он работает нормально для меня:

 def repeat():
    while True:
        print("Do you want to play again?")
        again = input('>')
        if again == 'y' or again == 'Y':
            operation = get_choice() # you need to assign "operator" to the return value
            ask_question(operation)
            check_response(response)
        else:
            break
repeat()
 

Выборочный вывод:

 Welcome!
What are we practicing? 
1. Addition ( ) 
2. Subtraction (-) 
3. Multiplication (*) 
4. Division (/)
>  
82   72
>154
Correct!
Do you want to play again?
>y
What are we practicing? 
1. Addition ( ) 
2. Subtraction (-) 
3. Multiplication (*) 
4. Division (/)
> -
57 - 28 # the sign did in fact change to -
>