Программа застряла в цикле while, не печатается

#python #string #random #input #raw-input

#python #строка #Случайный #ввод #необработанный ввод

Вопрос:

 import random

def usertype():
    randletter = random.choice('qwer')
    userinput = raw_input('Press ' str(randletter))
    if userinput == randletter:
        return 'Correct'
    else:
        return 'Incorrect'

def usertypetest(x,y,result):
    while x <= 9:
        result = usertype()
    if result == 'Correct':
        x = x 1
        y = y 5
    else:
        x = x 1
        y = y-2
    return str(y) 'is your score'

print usertypetest(0,0,usertype)
  

Вот мой код. Я хочу, чтобы он попросил пользователя нажать кнопку, выбранную случайным образом из набора (Q, W, E, R), затем напечатать либо правильно, либо неправильно, в зависимости от того, какую кнопку они нажимают. Я хочу, чтобы это произошло 10 раз. После десяти попыток он выведет их оценку: 5 для каждого «правильного» и -2 для «Неправильного». Вместо этого я получаю это.

 Press e(e)
Press e(e)
Press w(e)
Press q(e)
Press q(e)
Press q(e)
Press r(e)
Press e(e)
Press w(e)
Press q(e)
Press e(e)
Press e(e)
Press e(e)
Press e(e)
Press q(e)
Press w(e)
Press r(e)
Press w(e)
Press r(e)
Press w(e)
Press r(e)
Press r(e)
  

Независимо от того, что я ввожу, он не возвращает ни «Правильный», ни «Неправильный». Он также продолжается после 10 и не показывает их оценку. Очевидно, что я не вижу проблемы.

Мой ввод заключен в квадратные скобки.

Для пояснения, это то, что я хочу:

 Press q(q)
Correct
Press e(q)
Incorrect
Press w(w)
Correct
Press q(q)
Correct
Press e(eq)
Incorrect
Press e(e)
Correct
Press q(q)
Correct
Press q(r)
Incorrect
Press w(w)
Correct
Press r(r)
Correct
29 is your score
  

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

1. у вас ошибка отступа

Ответ №1:

В Python отступ очень важен.

В этом коде цикл x for while никогда не изменяется, поскольку if блок находится на том же уровне отступа while , что и цикл. Итак, единственная зацикленная инструкция result = usertype()

 while x <= 9:
    result = usertype()
if result == 'Correct':
    x = x 1
    y = y 5
  

Две дополнительные критические замечания:

Вы увеличиваете x в двух местах, когда это нужно сделать только один раз.

 while x <= 9:
    result = usertype()
    if result == 'Correct':
        y = y 5
    else:
        y = y-2
    x  = 1
  

Кроме того, поскольку вы выполняете цикл фиксированное количество раз, почему бы не игнорировать увеличение x и использовать цикл for, например:

 for x in range(10):
    result = usertype()
    if result == 'Correct':
        y = y 5
    else:
        y = y-2
  

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

1. Несмотря на ссылку на 9, исходный цикл фактически повторяется 10 раз, поэтому требуется замена range(10) . Но использование range() определенно более разумно.

2. Упс. Ошибка Fencepost

Ответ №2:

Вам нужно поместить if result == 'Correct': блок под while x <= 9: цикл, в котором вы получаете пользовательский ввод, чтобы он каждый раз оценивался. И вы можете добавить print(result) , чтобы получить правильную / неправильную обратную связь, как в вашем примере:

 def usertypetest(x,y,result):
    while x <= 9:
        result = usertype()
        if result == 'Correct':
            x = x 1
            y = y 5
        else:
            x = x 1
            y = y-2
        print(result)
    return str(y) 'is your score'
  

Ответ №3:

Ваша основная проблема заключалась в том, что у вас был блок if / else в неправильной области. Вам нужно было, чтобы это было под while блоком. Это гарантирует, что он проверяет, правильно ли пользователь ввел ввод при каждом запуске usertype() .

 import random

moves = 0
score = 0

def usertype():
    randletter = random.choice('qwer')
    userinput = raw_input('Press ' str(randletter))
    if userinput == randletter:
        return True
    else:
        return False

def usertypetest(moves, score):
    while moves < 10:
        result = usertype()
        moves = moves   1
        if result:
            score = score   5
        else:
            score = score - 2
    return str(score)   ' is your score'

print usertypetest(moves, score)
  

Ответ №4:

Кроме того, вы не печатаете значение переменной result . После оценки результата добавьте следующее:

результат печати

Ответ №5:

Помимо проблемы с отступом, которую выявили другие люди, код не является особенно идиоматичным Python. usertypetest() Функция может быть:

 def usertypetest(x,y,result):
    for x in range(10):
        if usertype() == 'Correct':
            y = y   5
        else:
            y = y - 2
    return '%d is your score' % y
  

Возможно, есть лучшие способы сделать это, но это немного проще и немного более Pythonic.

Я также замечу, что я не вижу круглых скобок вокруг ввода, которые, как утверждает пример, видны.

Если вы хотите увидеть вердикт по каждой букве, то вам нужно сохранить возврат из usertype() after all:

 def usertypetest(x,y,result):
    for x in range(10):
        result = usertype()
        print result
        if result == 'Correct':
            y = y   5
        else:
            y = y - 2
    return '%d is your score' % y
  

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

1. Спасибо, что показали мне, как это упростить. Хотя первый ответчик создал функциональный код, вы получаете 1 за упрощение. Также я просто поместил туда круглые скобки, чтобы идентифицировать входные данные, их не было в фактическом выводе.

Ответ №6:

Здесь есть несколько проблем.

  1. Вам нужно напечатать ‘correct’ до возврата usertype.
  2. Вам не нужно помещать ‘result’ в usertypetest.
  3. Поместите if…else внутри цикла в usertypetest.
  4. Измените свою последнюю печать.

Вот правильный код.

 import random

def usertype():
    randletter = random.choice('qwer')
    userinput = raw_input('Press ' str(randletter))
    if userinput == randletter:
        print 'Correct'
        return 'Correct'
    else:
        print 'Incorrect'
        return 'Incorrect'

def usertypetest(x,y):
    while x <= 9:
        result = usertype()
        if result == 'Correct':
            x = x 1
            y = y 5
        else:
            x = x 1
            y = y-2
    return str(y) 'is your score'

print usertypetest(0,0)
  

Ответ №7:

Просто поместите if блок под while цикл. Проблема решена.

Попробуйте с этим кодом :

 import random

def usertype():
    randletter = random.choice('qwer')
    userinput = raw_input('Press ' str(randletter))
    if userinput == randletter:
        return 'Correct'
    else:
        return 'Incorrect'

def usertypetest(x,y,result):
    while x <= 9:
        result = usertype()
        if result == 'Correct':
            x = x 1
            y = y 5
        else:
            x = x 1
            y = y-2
    return str(y) 'is your score'

print usertypetest(0,0,usertype)