Python: NameError без видимой причины? - PullRequest
1 голос
/ 01 декабря 2010
 from random import random

 def computer():
 computer = 0
 while computer < 21:
  val = int(random()*10)+1
  if (computer + val) > 21:
   break
  else:
   computer += val
 print "Ich habe ", computer, "!"
 return computer


    def player():
 player = 0
 loss = 0
 while player < 21:
                hval = int(random()*10)+1
                print "Du hast ", hval, "...\nNoch eine mit y..."
                if raw_input == "y":
                        player += hval
                        if player > 21:
                                print "Du hast verloren!"
                                loss = 1
                                break
                        else:
                                continue
                else:
                        player += hval
                        break
        return player
        return loss

    if __name__ == "__main__":
        player()
        if loss == 1: #This is where I get the NameError.
                pass
        else:
                computer()
                if computer > player:
                        print "Ich habe gewonnen!"
                else:
                        print "Du hast gewonnen"

Я вернул убыток в player (), поэтому не знаю, почему я продолжаю получать эту NameError.

Ответы [ 4 ]

3 голосов
/ 01 декабря 2010

Давайте исправим этот беспорядок и посмотрим, что это за ошибки:

from random import random # tip, check out randint (the function in the random module)

def computer():
    computer = 0
    while computer < 21:
        val = int(random()*10)+1 # please use some whitespace around operators

        if (computer + val) > 21:
            break

        else:
            computer += val

    print "Ich habe ", computer, "!"
    return computer

def player():
    player = 0
    loss = 0

    while player < 21:
        hval = int(random()*10)+1 # again, whitespace improves readability
        print "Du hast ", hval, "...\nNoch eine mit y..."

        if raw_input == "y": # raw_input is a function (hint you need to call the function)
                             # you're comparing the object against a string
                             # that will always yield false, therefore the player
                             # never gets the chance to enter another number

            # this never gets executed
            player += hval
            if player > 21:
                print "Du hast verloren!"
                loss = 1
                break

            else:
                continue

        # always gets executed
        else:
            player += hval
            break

    return player # this returns the value of player
    return loss # never reached, dead code, the return above has already left the function

if __name__ == "__main__":
    player() # returns the integer, but doesn't assign it to any name

    if loss == 1: # loss is not defined in this scope
        pass

    else:
        computer() # again, this doesn't assign the returned value

    if computer > player: # if this would get reached, it would fail yet again
                          # no name error this time, but you're comparing the function object
                          # against the player object, this will (at least in CPython)
                          # compare the memory addresses

        print "Ich habe gewonnen!"

    else:
        print "Du hast gewonnen"

Теперь вы знаете все ошибки, вы должны их исправить:)

Но я такжехочу отметить, что ваш отступ - это REAL беспорядок, в диапазоне от 1 пробела до 16 на отступ.
Особенно в Python, где отступ является важной частью синтаксиса, этони в коем случае не терпимо.

Пожалуйста, прочитайте PEP8 о том, как стилизовать ваш код.

1 голос
/ 01 декабря 2010

Когда вы пишете return loss, возвращается значение потери, а не переменная.Следовательно, имя loss не существует в вызывающей области.

Вам необходимо присвоить результат локальной переменной (которую также можно назвать потеря), например:

loss = player()
0 голосов
/ 01 декабря 2010

Вам следует исправить форматирование, но кроме этого, если вы вернули loss из player(), вы нигде не сохранили его.

if __name__ == "__main__":
    loss = player()   # the loss returned by player is now within the local loss
    if loss == 1: #This is where I get the NameError.
            pass
0 голосов
/ 01 декабря 2010
Потеря

не определена в вашем сценарии, опубликуйте весь сценарий, чтобы мы могли выполнить его, возможно, вы пытаетесь сослаться на переменную, которую вы использовали внутри player ()

...