2010-02-20 2 views
2

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

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

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 

Что я делаю неправильно?

----- ----- РЕДАКТИРОВАТЬ

программа заканчивает так, как:

Шаг 7 из 7:

Your PotatoHead will now be created... 

Creating variables... 

inputPHName

inputPHFirstToy

Тогда он идет к TRACBACK

----- ----- EDIT2

Это EXACT код, который я бегу в полном объеме:

#+--------------------------------------+# 
#| 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) 

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

+0

Вы когда-нибудь видели '' Ваши калории PotatoHead были успешно созданы! ''Печататься? –

+0

Нет, программа, кажется, останавливается, прежде чем она попадет в эту часть кода. – 2010-02-20 03:56:11

+2

«СтартNewGame» и «startGame» совпадают? Держу пари, что вы сортируете или реверсируете список 'MCreatePH' или' data' в методе '__init__'. 'l.sort()' и 'l.reverse()' в Python сортировать и реверсировать на месте и возвращать 'None'. Вы можете попробовать 'sorted (l)' и 'reverse (l)' соответственно, если хотите новый список. Но нам нужен реальный код. –

ответ

5

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

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

вы делаете

MCreatePH = startGame() 

но вы не определили StartGame? так что если заменить это с помощью startNewGame, то это работает

MCreatePH = startNewGame() 

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

+0

спасибо! он отлично работает сейчас :) – 2010-02-20 04:13:02

+1

Вы также можете улучшить свой код (соответствие с общинными соглашениями является улучшением), выполнив [PEP 8] (http://www.python.org/dev/peps/pep-0008 /): функции должны быть названы 'start_game' и' start_new_game', атрибуты должны быть названы 'ph_data' и' favourite_thing' и т. д. – bignose

0

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

welcomeMessage() 

MCreatePH = startGame() 

myPotatoHead = PotatoHead(MCreatePH) 

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

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