2011-05-03 7 views
5

He estado trabajando en esta tarea para la escuela y simplemente no puedo entender por qué no puedo hacer que este programa funcione correctamente. Estoy intentando que el programa permita al usuario ingresar tres animales. Solo me permite ingresar a uno. Sé que tiene que ver con la ubicación de la declaración return en la función make_list, pero no puedo encontrar la manera de solucionarlo.return statement in for bucles

Aquí está mi código:

import pet_class 

def main(): 
    #get list of pet objects 
    pets = make_list() 

    #Display the data in a list. 
    print 'Here is the data you entered:' 
    display_list(pets) 


#The make_list function gets data from the user for three pets. The function 
# returns a list of pet objects containing the data. 

def make_list(): 
    #create empty list. 
    pet_list = [] 

    #Add three pet objects to the list. 
    print 'Enter data for three pets.' 
    for count in range (1, 4): 
     #get the pet data. 
     print 'Pet number ' + str(count) + ':' 
     name = raw_input('Enter the pet name:') 
     animal=raw_input('Enter the pet animal type:') 
     age=raw_input('Enter the pet age:') 
     print 

     #create a new pet object in memory and assign it 
     #to the pet variable 

     pet = pet_class.PetName(name,animal,age) 

     #Add the object to the list. 
     pet_list.append(pet) 

     #Return the list 
     return pet_list 

#The display_list function accepts a list containing pet objects 
#as an argument and displays the data stored in each object. 

def display_list(pet_list): 
    for item in pet_list: 
     print item.get_name() 
     print item.get_animal_type() 
     print item.get_age() 
     print 

#call main function 
main() 

Respuesta

2

desmontar uno guión antes del retorno.

+2

Un poco más de detalle ayudaría: El bucle for en make_list() va por completo una vez y luego regresa. En la sangría de pitón es importante. –

7

Solo tiene que devolver el pet_list fuera del bucle for, por lo que sucederá después de que el bucle haya terminado de ejecutarse.

def make_list(): 
    pet_list = [] 

    print 'Enter data for three pets.' 
    for count in range (1, 4): 
     print 'Pet number ' + str(count) + ':' 
     name = raw_input('Enter the pet name:') 
     animal=raw_input('Enter the pet animal type:') 
     age=raw_input('Enter the pet age:') 
     print 

     pet = pet_class.PetName(name,animal,age) 
     pet_list.append(pet) 

    return pet_list 
+0

Muchas gracias. Es increíble cómo algo tan simple puede pasarse por alto –

2

Tiene la declaración de devolución en el nivel de indentación incorrecto. Debería tener la misma profundidad que la declaración for. Tener el retorno dentro del ciclo hace que salga del ciclo.

0

Su espacio está desactivado. return pet_list está en el alcance del ciclo for.

22

Solo estoy respondiendo esto otra vez, porque noto que su sujeto ya expone el problema, y ​​nadie ha dado una ... explicación teórica, aquí ... la palabra teórica es demasiado grande en este caso, pero lo que sea.

Su problema es, precisamente, que está colocando la declaración return dentro del for-loop. El bucle for ejecuta cada instrucción en él tantas veces ... si una de sus declaraciones es una devolución, la función regresará cuando la golpee. Esto tiene sentido, por ejemplo, el siguiente caso:

def get_index(needle, haystack): 
    for x in range(len(haystack)): 
     if haystack[x] == needle: 
      return x 

Aquí, las iteraciones de la función hasta que encuentra cuando la aguja está en el pajar, y devuelve ese índice (hay una función incorporada de hacer esto, de todos modos) Si desea que la función se ejecute cuantas veces lo indique, debe poner el retorno DESPUÉS del ciclo for, no dentro de él, de esa manera, la función regresará después de que el control salga del ciclo

def add(numbers): 
    ret = 0 
    for x in numbers: 
     ret = ret + x 

    return ret 

(una vez más, hay una función incorporada de hacerlo así)

1

se nota el bucle se ejecuta una sola vez debido a que la instrucción de retorno está dentro de la sentencia if, dentro del bucle

que he tenido un problema similar en este momento con mi código:

Devuelve la cantidad de enteros pares en la matriz dada. Nota: el operador% "mod" calcula el resto, p. 5% 2 es 1.

count_evens([2, 1, 2, 3, 4]) → 3 
count_evens([2, 2, 0]) → 3 
count_evens([1, 3, 5]) → 0 

def count_evens(nums): 
    summary = 0 
    for i in nums: 

     if i % 2 == 0: 
      summary += 1 
      return summary  



count_evens([2, 1, 2, 3, 4]) 

si va a visualizar la ejecución y pegar en mi código http://www.pythontutor.com/visualize.html#mode=edit

Una vez que sin sangrar 8 espacios (misma profundidad que la sentencia for), que corrió varias veces y dio la salida correcta

Cuestiones relacionadas