2014-10-10 4 views
0

Ошибка, но я не знаю почему .. (Я учу) Мой код;Очень простой python

import random 
input("Hit enter to roll the dice") 
global answer 
def rollDice(): 
    result = random.randrange(1,6) 
    print ("It landed on.." + str(result)) 
    answer = input("would you like to play again? [y/n]") 
rollDice(); 


if (answer == "y" or "Y"): 
    rollDice(); 

Ошибка; (Некоторые из сценария работы)

Hit enter to roll the dice 
It landed on..5 
would you like to play again? [y/n]y 
Traceback (most recent call last): 
    File "diceRoller.py", line 11, in <module> 
    while (answer == "y" or "Y"): 
NameError: name 'answer' is not defined 
+1

[Краткое описание правил обзора Python] (http://stackoverflow.com/q/291978/2359271) – Air

+2

'global answer' принадлежит * внутри * функция. После этого у вас будет другая проблема, см. [Как проверить одну переменную на несколько значений?] (Http://stackoverflow.com/q/15112125) –

ответ

5

На вершине, что ответы говорят, я бы посоветовал вам не использовать global, вместо этого я бы return хотел ли человек продолжать или нет, и продолжают основаны от того, например:

import random 
input("Hit enter to roll the dice") 
def rollDice(): 
    result = random.randrange(1,6) 
    print("It landed on.. " + str(result)) 
    answer = input("Would you like to play again? [y/n]") 
    if answer in ("y", "Y"): 
     return True 
    return False 

while rollDice(): 
    continue 

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

+0

Это alid tidier .. спасибо! однако зачем нам возвращать ложь, если мы вернемся, если они скажут «да»? –

+0

Как только вы дойдете до оператора возврата, вы выйдете из функции. Поэтому, если пользователь вводит «y» или «Y», вы оставляете функцию.«Возврат False» предназначен для обработки другого случая, когда они не вводят «y» или «Y». – Dair

+0

Или просто 'return (answer in (" y "," Y "))' – alexis

0

Ваше определение функции это то, что нужно знать, что answer носит глобальный характер. Поэтому разместите свою декларацию global внутри тела определения.

def rollDice(): 
    global answer 
    result = random.randrange(1,6) 
    print ("It landed on.." + str(result)) 
    answer = input("would you like to play again? [y/n]") 

Также

if (answer == "y" or "Y"): 

должен быть

if answer in ('y', 'Y'): 

иначе вы проверяете, если либо (answer=="y") или ("Y"), последний из которых всегда имеет значение True.

Если вы хотите продолжать работать на неопределенный срок, пока пользователи ответят утвердительно, то ваш if должен быть while.

while answer in ('y', 'Y'): 
+0

сделал изменения, которые вы сказали, однако он будет всего лишь три раза почему? –

+0

@ DamhanRichardson Я не вижу причин, по которым он остановится после трех итераций. Он не делает этого, когда я пытаюсь. – khelwood

0

ключевое слово global должно находиться внутри тела функции. Кроме того, как сказал Фалмарри, if (answer=="y" or "Y") должен быть `if answer ==" y "или отвечать ==" Y "

0

Прежде всего, global answer не влияет на глобальную сферу. Поместите его внутри функции.

Но довольно сложно отлаживать ваш код, поскольку трассировка относится к строке кода, которая не отображается в источнике, который вы показываете! (while против if)

В любом случае, if answer = 'y' or 'Y' должен быть if answer in tuple('yY')

+1

это означает, что «yY» также означает True. Я не думаю, что это было бы желательно здесь – user3885927

+0

@ user3885927 Хорошо поймать! 'если ответ в кортеже ('yY')' в этом случае. – jacg

Смежные вопросы