Возвращение списка из функции в Python - PullRequest
2 голосов
/ 20 февраля 2010

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

Соответствующий код выглядит следующим образом:

def startNewGame():
    while 1:
    #Introduction:
        print
        print """Hello,
    You will now be guided through the setup process.
There are 7 steps to this.
You can cancel setup at any time by typing 'cancelSetup'
        Thankyou"""
    #Step 1 (Name):
        print
        print """Step 1 of 7:
    Type in a name for your PotatoHead:
    """
        inputPHName = raw_input('|Enter Name:|')
        if inputPHName == 'cancelSetup':
            sys.exit()
    #Step 2 (Gender):
        print
        print """Step 2 of 7:
    Choose the gender of your PotatoHead:
                        input either 'm' or 'f'
    """
        inputPHGender = raw_input('|Enter Gender:|')
        if inputPHGender == 'cancelSetup':
            sys.exit()
    #Step 3 (Colour):
        print
        print """Step 3 of 7:
    Choose the colour your PotatoHead will be:
                        Only Red, Blue, Green and Yellow are currently supported
    """
        inputPHColour = raw_input('|Enter Colour:|')
        if inputPHColour == 'cancelSetup':
            sys.exit()
    #Step 4 (Favourite Thing):
        print
        print """Step 4 of 7:
    Type your PotatoHead's favourite thing:
    """
        inputPHFavThing = raw_input('|Enter Favourite Thing:|')
        if inputPHFavThing == 'cancelSetup':
            sys.exit()
    # Step 5 (First Toy):
        print
        print """Step 5 of 7:
    Choose a first toy for your PotatoHead:
    """
        inputPHFirstToy = raw_input('|Enter First Toy:|')
        if inputPHFirstToy == 'cancelSetup':
            sys.exit()
    #Step 6 (Check stats):
        while 1:
            print
            print """Step 6 of 7:
    Check the following details to make sure that they are correct:
    """
            print
            print """Name:\t\t\t""" + inputPHName + """
Gender:\t\t\t""" + inputPHGender + """
Colour:\t\t\t""" + inputPHColour + """
Favourite Thing:\t""" + inputPHFavThing + """
First Toy:\t\t""" + inputPHFirstToy + """
"""
            print
            print "Enter 'y' or 'n'"
            inputMCheckStats = raw_input('|Is this information correct?|')
            if inputMCheckStats == 'cancelSetup':
                sys.exit()
            elif inputMCheckStats == 'y':
                break
            elif inputMCheckStats == 'n':
                print "Re-enter info: ..."
                print
                break
            else:
                "The value you entered was incorrect, please re-enter your choice"
        if inputMCheckStats == 'y':
            break
    #Step 7 (Define variables for the creation of the PotatoHead):
    MFCreatePH = []
    print
    print """Step 7 of 7:
    Your PotatoHead will now be created...

    Creating variables...
    """
    MFCreatePH = [inputPHName, inputPHGender, inputPHColour, inputPHFavThing, inputPHFirstToy]
    time.sleep(1)
    print "inputPHName"
    print
    time.sleep(1)
    print "inputPHFirstToy"
    print
    return MFCreatePH
    print "Your PotatoHead varibles have been successfully created!"

Затем она передается другой функции, которая была импортирована из другого модуля

from potatohead import *

...

welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)

код объекта PotatoHead находится в модуле potatohead.py, который был импортирован выше, и выглядит следующим образом:

class PotatoHead:
#Initialise the PotatoHead object:
def __init__(self, data):
    self.data = data    #Takes the data from the start new game function - see main.py
    #Defines the PotatoHead starting attributes:
    self.name = data[0]
    self.gender = data[1]
    self.colour = data[2]
    self.favouriteThing = data[3]
    self.firstToy = data[4]
    self.age = '0.0'
    self.education = [self.eduScience, self.eduEnglish, self.eduMaths] = '0.0', '0.0', '0.0'
    self.fitness = '0.0'
    self.happiness = '10.0'
    self.health = '10.0'
    self.hunger = '0.0'
    self.tiredness = 'Not in this version'
    self.toys = []
    self.toys.append(self.firstToy)
    self.time = '0'
    #Sets data lists for saving, loading and general use:
    self.phData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy)
    self.phAdvData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy,
                      self.age, self.education, self.fitness, self.happiness, self.health, self.hunger,
                      self.tiredness, self.toys)

Однако, когда я запускаю программу, появляется эта ошибка:

Traceback (most recent call last):
 File "/Users/Jasper/Documents/Programming/Potato Head Game/Current/main.py", line 158, in <module>
myPotatoHead = PotatoHead(MCreatePH)
 File "/Users/Jasper/Documents/Programming/Potato Head Game/Current/potatohead.py", line 15, in __init__
self.name = data[0]
TypeError: 'NoneType' object is unsubscriptable

Что я делаю не так?

----- EDIT -----

Программа заканчивается так:

Шаг 7 из 7:

Your PotatoHead will now be created...

Creating variables...

inputPHName

inputPHFirstToy

Затем он идет к Tracback

----- EDIT2 -----

Это ТОЧНЫЙ код, который я запускаю полностью:

#+--------------------------------------+#
#| main.py                              |#
#| A main module for the Potato Head    |#
#|  Game to pull the other modules      |#
#|  together and control through user   |#
#|  input                               |#
#| Author:                |#
#| Date Created / Modified:             |#
#|              3/2/10 | 20/2/10         |#
#+--------------------------------------+#  Tested: No

#Import the required modules:
import time
import random
import sys
from potatohead import *
from toy import *

#Start the Game:
def welcomeMessage():
    print "----- START NEW GAME -----------------------"
    print "==Print Welcome Message=="
    print "loading... \t loading... \t loading..."
    time.sleep(1)
    print "loading..."
    time.sleep(1)
    print "LOADED..."
    print; print; print;
    print """Hello,
    Welcome to the Potato Head Game. In this game you can create
a Potato Head, and look after it, like a Virtual Pet.
    This game is constantly being updated and expanded. Please
look out for updates.
"""

#Choose whether to start a new game or load a previously saved game:
def startGame():
    while 1:
        print "--------------------"
        print """ Choose an option:
New_Game
or
Load_Game
"""
        startGameInput = raw_input('>>> >')
        if startGameInput == 'New_Game':
            startNewGame()
            break
        elif startGameInput == 'Load_Game':
            print "This function is not yet supported"
            print "Try Again"
            print
        else:
            print "You must have mistyped the command: Type either 'New_Game' or 'Load_Game'"
            print

#Set the new game up:
def startNewGame():
    while 1:
    #Introduction:
        print
        print """Hello,
    You will now be guided through the setup process.
There are 7 steps to this.
You can cancel setup at any time by typing 'cancelSetup'
        Thankyou"""
    #Step 1 (Name):
        print
        print """Step 1 of 7:
    Type in a name for your PotatoHead:
    """
        inputPHName = raw_input('|Enter Name:|')
        if inputPHName == 'cancelSetup':
            sys.exit()
    #Step 2 (Gender):
        print
        print """Step 2 of 7:
    Choose the gender of your PotatoHead:
                        input either 'm' or 'f'
    """
        inputPHGender = raw_input('|Enter Gender:|')
        if inputPHGender == 'cancelSetup':
            sys.exit()
    #Step 3 (Colour):
        print
        print """Step 3 of 7:
    Choose the colour your PotatoHead will be:
                        Only Red, Blue, Green and Yellow are currently supported
    """
        inputPHColour = raw_input('|Enter Colour:|')
        if inputPHColour == 'cancelSetup':
            sys.exit()
    #Step 4 (Favourite Thing):
        print
        print """Step 4 of 7:
    Type your PotatoHead's favourite thing:
    """
        inputPHFavThing = raw_input('|Enter Favourite Thing:|')
        if inputPHFavThing == 'cancelSetup':
            sys.exit()
    # Step 5 (First Toy):
        print
        print """Step 5 of 7:
    Choose a first toy for your PotatoHead:
    """
        inputPHFirstToy = raw_input('|Enter First Toy:|')
        if inputPHFirstToy == 'cancelSetup':
            sys.exit()
    #Step 6 (Check stats):
        while 1:
            print
            print """Step 6 of 7:
    Check the following details to make sure that they are correct:
    """
            print
            print """Name:\t\t\t""" + inputPHName + """
Gender:\t\t\t""" + inputPHGender + """
Colour:\t\t\t""" + inputPHColour + """
Favourite Thing:\t""" + inputPHFavThing + """
First Toy:\t\t""" + inputPHFirstToy + """
"""
            print
            print "Enter 'y' or 'n'"
            inputMCheckStats = raw_input('|Is this information correct?|')
            if inputMCheckStats == 'cancelSetup':
                sys.exit()
            elif inputMCheckStats == 'y':
                break
            elif inputMCheckStats == 'n':
                print "Re-enter info: ..."
                print
                break
            else:
                "The value you entered was incorrect, please re-enter your choice"
        if inputMCheckStats == 'y':
            break
    #Step 7 (Define variables for the creation of the PotatoHead):
    MFCreatePH = []
    print
    print """Step 7 of 7:
    Your PotatoHead will now be created...

    Creating variables...
    """
    MFCreatePH = [inputPHName, inputPHGender, inputPHColour, inputPHFavThing, inputPHFirstToy]
    time.sleep(1)
    print "inputPHName"
    print
    time.sleep(1)
    print "inputPHFirstToy"
    print
    return MFCreatePH
    print "Your PotatoHead varibles have been successfully created!"

#Run Program:
welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)

Модуль potatohead.py выглядит следующим образом:

#+--------------------------------------+#
#| potatohead.py                        |#
#| A module for the Potato Head Game    |#
#| Author:                              |#
#| Date Created / Modified:             |#
#|              24/1/10 | 24/1/10       |#
#+--------------------------------------+#  Tested: Yes (24/1/10)

#Create the PotatoHead class:
class PotatoHead:
    #Initialise the PotatoHead object:
    def __init__(self, data):
        self.data = data    #Takes the data from the start new game function - see main.py
        #Defines the PotatoHead starting attributes:
        self.name = data[0]
        self.gender = data[1]
        self.colour = data[2]
        self.favouriteThing = data[3]
        self.firstToy = data[4]
        self.age = '0.0'
        self.education = [self.eduScience, self.eduEnglish, self.eduMaths] = '0.0', '0.0', '0.0'
        self.fitness = '0.0'
        self.happiness = '10.0'
        self.health = '10.0'
        self.hunger = '0.0'
        self.tiredness = 'Not in this version'
        self.toys = []
        self.toys.append(self.firstToy)
        self.time = '0'
        #Sets data lists for saving, loading and general use:
        self.phData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy)
        self.phAdvData = (self.name, self.gender, self.colour, self.favouriteThing, self.firstToy,
                          self.age, self.education, self.fitness, self.happiness, self.health, self.hunger,
                          self.tiredness, self.toys)

    #Define the phStats variable, enabling easy display of PotatoHead attributes:
    def phDefStats(self):
        self.phStats = """Your Potato Head's Stats are as follows:
----------------------------------------
Name: \t\t""" + self.name + """
Gender: \t\t""" + self.gender + """
Colour: \t\t""" + self.colour + """
Favourite Thing: \t""" + self.favouriteThing + """
First Toy: \t""" + self.firstToy + """
Age: \t\t""" + self.age + """
Education: \t""" + str(float(self.eduScience) + float(self.eduEnglish) + float(self.eduMaths)) + """
-> Science: \t""" + self.eduScience + """
-> English: \t""" + self.eduEnglish + """
-> Maths:   \t""" + self.eduMaths + """
Fitness: \t""" + self.fitness + """
Happiness: \t""" + self.happiness + """
Health: \t""" + self.health + """
Hunger: \t""" + self.hunger + """
Tiredness: \t""" + self.tiredness + """
Toys: \t\t""" + str(self.toys) + """
Time: \t\t""" + self.time + """
"""

    #Change the PotatoHead's favourite thing:
    def phChangeFavouriteThing(self, newFavouriteThing):
        self.favouriteThing = newFavouriteThing
        phChangeFavouriteThingMsg = "Your Potato Head's favourite thing is " + self.favouriteThing + "."

    #"Feed" the Potato Head i.e. Reduce the 'self.hunger' attribute's value:
    def phFeed(self):
        if float(self.hunger) >=3.0:
            self.hunger = str(float(self.hunger) - 3.0)
        elif float(self.hunger) < 3.0:
            self.hunger = '0.0'
        self.time = str(int(self.time) + 1) #Pass time

    #"Exercise" the Potato Head if between the ages of 5 and 25:
    def phExercise(self):
        if float(self.age) < 5.1 or float(self.age) > 25.1:
            print "This Potato Head is either too young or too old for this activity!"
        else:
            if float(self.fitness) <= 8.0:
                self.fitness = str(float(self.fitness) + 2.0)
            elif float(self.fitness) > 8.0:
                self.fitness = '10.0'
        self.time = str(int(self.time) + 1) #Pass time

    #"Teach" the Potato Head:
    def phTeach(self, subject):
        if subject == 'Science':
            if float(self.eduScience) <= 9.0:
                self.eduScience = str(float(self.eduScience) + 1.0)
            elif float(self.eduScience) > 9.0 and float(self.eduScience) < 10.0:
                self.eduScience = '10.0'
            elif float(self.eduScience) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        elif subject == 'English':
            if float(self.eduEnglish) <= 9.0:
                self.eduEnglish = str(float(self.eduEnglish) + 1.0)
            elif float(self.eduEnglish) > 9.0 and float(self.eduEnglish) < 10.0:
                self.eduEnglish = '10.0'
            elif float(self.eduEnglish) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        elif subject == 'Maths':
            if float(self.eduMaths) <= 9.0:
                self.eduMaths = str(float(self.eduMaths) + 1.0)
            elif float(self.eduMaths) > 9.0 and float(self.eduMaths) < 10.0:
                self.eduMaths = '10.0'
            elif float(self.eduMaths) == 10.0:
                print "Your Potato Head has gained the highest level of qualifications in this subject! It cannot learn any more!"
        else:
            print "That subject is not an option..."
            print "Please choose either Science, English or Maths"
        self.time = str(int(self.time) + 1) #Pass time

    #Increase Health:
    def phGoToDoctor(self):
        self.health = '10.0'
        self.time = str(int(self.time) + 1) #Pass time

    #Sleep: Age, change stats:              #(Time Passes)
    def phSleep(self):
        self.time = '0'                   #Resets time for next 'day' (can do more things next day)
        #Increase hunger:
        if float(self.hunger) <= 5.0:
            self.hunger = str(float(self.hunger) + 5.0)
        elif float(self.hunger) > 5.0:
            self.hunger = '10.0'
        #Lower Fitness:
        if float(self.fitness) >= 0.5:
            self.fitness = str(float(self.fitness) - 0.5)
        elif float(self.fitness) < 0.5:
            self.fitness = '0.0'
        #Lower Health:
        if float(self.health) >= 0.5:
            self.health = str(float(self.health) - 0.5)
        elif float(self.health) < 0.5:
            self.health = '0.0'
        #Lower Happiness:
        if float(self.happiness) >= 2.0:
            self.happiness = str(float(self.happiness) - 2.0)
        elif float(self.happiness) < 2.0:
            self.happiness = '0.0'
        #Increase the Potato Head's age:
        self.age = str(float(self.age) + 0.1)

Игра все еще находится в стадии разработки - могут быть части модулей, которые еще не завершены, но я не думаю, что они вызывают проблему

Ответы [ 2 ]

5 голосов
/ 20 февраля 2010

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

Я скопировал ваш код, и он работает без проблем, хотя я сделал небольшое изменение

вы делаете

MCreatePH = startGame()

но вы не определили startGame? так что если заменить на startNewGame, он будет работать

MCreatePH = startNewGame()

Так может быть, вы где-то определили startGame, и он ничего не возвращает?

0 голосов
/ 20 февраля 2010

Сначала я подумал, что вы просто вызываете функцию, которая не существует, потому что ваш фрагмент "соответствующего кода" показывает нам определение startNewGame (), за которым следует следующее:

welcomeMessage()

MCreatePH = startGame()

myPotatoHead = PotatoHead(MCreatePH)

Однако затем я прочитал полный код и увидел, что startGame () также является функцией.

В функции startGame() у вас есть регистр, который вызовет startNewGame(), но ничто никогда не возвращает данные из startNewGame() при вызове startGame(). Вот почему метод __init__ создаваемого вами экземпляра PotatoHead не может выполнить индексацию данных. В функции startGame() вы можете поставить «return» перед тем, где вы вызываете startNewGame(), и я думаю, что все должно хорошо соединиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...