2016-03-21 2 views
0

Я пытаюсь найти способ доступа к функции confirmpath() в функции pathcond(). Пожалуйста помоги.Как получить доступ к вложенной функции глобально в Python 2.7

PS. Я только начал изучать Python около недели назад, поэтому любая помощь в отношении моей краткости кода и улучшения моих общих навыков будет действительно оценена.

Ниже приводится код мне нужна помощь с:

def name(): 
    global call 
    call = raw_input("What is your name?\n") 
    print("Hello " + call) 

def game(): 
    global charchoose 
    charchoose = raw_input("What will be your character " + call + ": Mage, Wizard or Knight?\n") 
    print("You chose " + charchoose) 

def path(): 
    pathchoose = raw_input("You are a " + charchoose + " who was walking down Tranversia and came across a three-way road. Which on will you choose? Land, Sea or Clouds\n").lower() 
    def confirmpath(): 
     global confirmpath 
     confirmpath = raw_input("You chose " + pathchoose + ". Are you sure you want to continue? Yes or No?\n").lower() 
     pathcond() 
    confirmpath() 

def pathcond(): 
    while confirmpath == "no": 
     path() 
    if confirmpath == "yes": 
     print("Good choice, you win!") 
    else: 
     print("Sorry, we didn't get that. Can you answer again, please?") 
     confirmpath() 

def ask(): 
    askplay = raw_input("Would you like to play a game? Yes or No?\n").lower() 
    if askplay == "yes": 
     game() 
     path() 
    elif askplay == "no": 
     print("That's alright. Thanks for hanging out, though. Bye!") 
    else: 
     print("Sorry, I didn't get that. Please try again.") 
     ask() 

name() 
ask() 

UPDATE: я работал дальше по программе на некоторое время и в конечном итоге с версией, которая теперь без проблем. Я разместил его ниже, пожалуйста, помогите мне улучшить его, предложив, что я могу изменить/улучшить/удалить. Код выглядит следующим образом:

def Initiate(): 
    global call 
    call = raw_input("What is your name?\n") 
    print("Hello " + call) 
    begin() 

def game(): 
    global charchoose 
    charchoose = raw_input("What will be your character " + call + ": Mage, Wizard or Knight?\n") 
    print("You chose " + charchoose) 
    path() 

def path(): 
    global pathchoose 
    pathchoose = raw_input("You are a " + charchoose + " who was walking down Tranversia and came across a three-way road. Which on will you choose? Land, Sea or Clouds\n").lower() 
    confirmpath() 

def confirmpath(): 
    global confirmpaths 
    confirmpaths = raw_input("You chose " + pathchoose + ". Are you sure you want to continue? Yes or No?\n").lower() 
    pathcond() 

def pathcond(): 
    while confirmpaths == "no": 
     path() 
    if confirmpaths == "yes": 
     print("Good choice, you win!") 
    else: 
     print("Sorry, we didn't get that. Can you answer again, please?") 
     confirmpath() 


def begin(): 
    askplay = raw_input("Would you like to play a game? Yes or No?\n").lower() 
    if askplay == "yes": 
     game() 
    elif askplay == "no": 
     print("That's alright. Thanks for hanging out, though. Bye!") 
    else: 
     print("Sorry, I didn't get that. Please try again.") 
     ask() 

Initiate() 

UPDATE 2: Функции код правильно, но все заканчивается печать следующую строку несколько раз

if confirmpaths == "yes": 
    print("Good choice, you win!") 

Я заметил, что она выводит строку столько раз, сколько Я отвечаю на функцию confirmpath(), независимо от моего ответа.

+3

Почему вы определяете 'confirmpath()' inside 'path()' для начала? Просто определите его в глобальном масштабе. – chepner

+0

Да, сделайте это вне функции path() – jonhid

+0

Re Update 2: 'while confirmpaths' следует изменить на' if confirmpaths' –

ответ

1

По существу, вы пытаетесь создать Finite State Machine. В Python это, вероятно, лучше всего реализуется с использованием класса. Вот similar example, которые могут быть полезны.

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

class Game: 
    def __init__(self): 
     self.name = raw_input("What is your name?\n") 
     print("Hello " + self.name) 
     self.ask() 

    def ask(self): 
     askplay = raw_input("Would you like to play a game? Yes or No?\n").lower() 
     if askplay == "yes": 
      self.game() 
     elif askplay == "no": 
      print("That's alright. Thanks for hanging out, though. Bye!") 
     else: 
      print("Sorry, I didn't get that. Please try again.") 
      self.ask() 

    def game(self): 
     self.charchoose = raw_input("What will be your character " + self.name + ": " 
      "Mage, Wizard or Knight?\n") 
     print("You chose " + self.charchoose) 
     self.path() 

    def path(self): 
     pathchoose = raw_input("You are a " + self.charchoose + " " 
      "who was walking down Tranversia and came across a three-way road. " 
      "Which on will you choose? Land, Sea or Clouds\n").lower() 
     self.confirmpath(pathchoose) 

    def confirmpath(self, pathchoose): 
     confirmpaths = raw_input("You chose " + pathchoose + ". " 
      "Are you sure you want to continue? Yes or No?\n").lower() 
     self.pathcond(confirmpaths, pathchoose) 

    def pathcond(self, confirmpaths, pathchoose): 
     if confirmpaths == "no": 
      self.path() 
     if confirmpaths == "yes": 
      print("Good choice, you win!") 
     else: 
      print("Sorry, we didn't get that. Can you answer again, please?") 
      self.confirmpath(pathchoose) 

Game() 

Когда Game() вызывается, объект (экземпляр) создается. Все методы экземпляра в классе относятся к self, который является именем этого экземпляра.

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

1

У вас есть некоторые проблемы здесь, я исправлю их для вас.

def name(): 
    global call 
    call = raw_input("What is your name?\n") 
    print("Hello " + call) 

def game(): 
    global charchoose 
    charchoose = raw_input("What will be your character " + call + ": Mage, Wizard or Knight?\n") 
    print("You chose " + charchoose) 

def path(): 
    pathchoose = raw_input("You are a " + charchoose + " who was walking down Tranversia and came across a three-way road. Which on will you choose? Land, Sea or Clouds\n").lower() 
    confirmpath(pathchoose) 

def confirmpath(pathchoose): 
    confirmpath_var = raw_input("You chose " + pathchoose + ". Are you sure you want to continue? Yes or No?\n").lower() 
    pathcond(confirmpath_var) 

def pathcond(confirmpath_var): 
    while confirmpath_var == "no": 
     path() 
    if confirmpath_var == "yes": 
     print("Good choice, you win!") 
    else: 
     print("Sorry, we didn't get that. Can you answer again, please?") 
     confirmpath() 

def ask(): 
    askplay = raw_input("Would you like to play a game? Yes or No?\n").lower() 
    if askplay == "yes": 
     game() 
     path() 
    elif askplay == "no": 
     print("That's alright. Thanks for hanging out, though. Bye!") 
    else: 
     print("Sorry, I didn't get that. Please try again.") 
     ask() 

name() 
ask() 

Объяснение: Во-первых, просто поставить свои функции на глобальном масштабе, потому что в этом контексте не имеет смысла делать то, что вы делаете (определение функции внутри функции), если вы называя эту внутреннюю функцию в разных местах. Во-вторых, вместо использования глобальных переменных передайте переменные в функции. Использование глобальных переменных, которые используют функции, не является хорошей практикой и приводит к кодам спагетти и теневым переменным Why are global variables evil?. Используйте параметры функций для передачи в него значений.

Я проверил код выше, он работает.

+0

Код все еще дает мне ошибку, когда я намеренно пытаюсь создать ситуацию для выполнения условия else в функция pathcond (confirmpath_var). –

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