Returning a list from a function in Python
- by Jasper
Hi,
I'm creating a game for my sister, and I want a function to return a list variable, so I can pass it to another variable.
The relevant code is as follows:
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!"
Then it is passed to another function that was imported from another module
from potatohead import *
...
welcomeMessage()
MCreatePH = startGame()
myPotatoHead = PotatoHead(MCreatePH)
the code for the PotatoHead object is in the potatohead.py module which was imported above, and is as follows:
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)
However, when I run the program this error appears:
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
What am i doing wrong?
-----EDIT-----
The program finishes as so:
Step 7 of 7:
Your PotatoHead will now be created...
Creating variables...
inputPHName
inputPHFirstToy
Then it goes to the Tracback
-----EDIT2-----
This is the EXACT code I'm running in its entirety:
#+--------------------------------------+#
#| 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)
The potatohead.py module is as follows:
#+--------------------------------------+#
#| 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)
The game is still under development - There may be parts of modules that aren't complete, but I don't think they're causing the problem