Consulta sobre PYTHON y el manejo de variables en la funcion def, diccionarios y listas


#1

Buenas a todos, lamento importunarlos con esta consulta, pero es que me esta costando encontrar informacion por fuera en libros y sitios, que me explique lo que quiero saber.

Mi duda es sobre el funcionamiento que de las funciones definidas por usuario en los ejercicios que propone Codecademy cuando uno empieza con el programa para detectar promedios ’ Student Becomes the Teacher’. Antes ya hay otros ejercicios pero en este concretamente no logro entender lo que hace python.

Las preguntas concretas son:

Como es que al definir una funcion ‘def get_class_average’ y marcarle un argumento como ‘class_list’, que no es una variable definida, python asocia class_list con la lista de estudiantes?
Como es que la sentencia ‘student_avg=get_average(student)’ entiende a que valor me refiero con ‘student’?
No entiendo la logica que utiliza el lenguaje en la asignacion de variables no-definidas cuando uno define una funcion de usuario. Ni siquiera se si las preguntas estan bien hechas y si podre recibir la informacion que espero, pero bueno, quedo a la espera de cualquier respuesta, ya sea en forma de bibliografia util o escrita personalmente. Desde ya muchas gracias a todos! :sweat_smile::sweat_smile:

El codigo en cuestion es este:

Lesson 8 Part of the whole

lloyd = {
  "name": "Lloyd",
  "homework": [90.0, 97.0, 75.0, 92.0],
  "quizzes": [88.0, 40.0, 94.0],
  "tests": [75.0, 90.0]
}
alice = {
  "name": "Alice",
  "homework": [100.0, 92.0, 98.0, 100.0],
  "quizzes": [82.0, 83.0, 91.0],
  "tests": [89.0, 97.0]
}
tyler = {
  "name": "Tyler",
  "homework": [0.0, 87.0, 75.0, 22.0],
  "quizzes": [0.0, 75.0, 78.0],
  "tests": [100.0, 100.0]
}

# Add your function below!
def average(numbers):
  total = sum(numbers)
  total = float(total)
  return total/len(numbers)

def get_average(student):
  homework = average(student["homework"])
  quizzes = average(student["quizzes"])
  tests = average(student["tests"])
  return 0.1 * homework + 0.3 * quizzes + 0.6 * tests

def get_class_average(class_list):
  results = []
  for student in class_list:
    student_avg = get_average(student)
    results.append(student_avg)
  return average(results)


#2

Remember to add a students list to your data.

students = [lloyd, alice, tyler]

which you can not pass to the get_class_average function.

print (get_class_average(students))

#3

Si gracias! Justamente en la siguiente leccion debo crear esa lista.
Pero sigo sin entender como funciona la cuestion de las funciones definidas por usuario. Por ejemplo (otro mas), en esta def se coloca la palabra ‘numbers’. Pero se que no se definio numbers en ningun momento, de alguna manera python asocia numbers al dato que justamente quiero usar y no entiendo como:
‘’’
def average(numbers):
total = sum(numbers)
total = float(total)
return total/len(numbers)
‘’’


#4

The variable is defined locally in the function, Parameters receive the value in the call argument. Within the function it is a local variable, not visible to the outside

In the above example we run into a case of reference by name. Since numbers is a list, the call argument list can have any name, but will be the same object within the function. In the case of lists and other data structures (dict, set, tuple) the object is not passed in. Only the name is given. The object will be known locally by the name we give it in the parameter, but it will not be a unique object. It IS the list at the caller.

>>> def average(numbers):
    print (id(numbers))
    total = sum(numbers)
    total = float(total)
    return total/len(numbers)

>>> grades = [89, 91, 78, 85, 95]
>>> print (id(grades))
49159544
>>> print (average(grades))
49159544
87.6
>>> 

Notice that numbers has the same object id as grades?


#5

Darn!
I think I understand the matter better now. Your answer was very clear (and fast!), I’ll see if I play a little with the functions in order to finish falling into the functions matter.
I thank you very much for taking the trouble to answer something that surely the most advanced programmers will find almost silly.

Until next time!:hugs:


#6

Impossible. It will pique their interest. Only problem being their reply, as honest and correct as it is, may fly right over one’s head. Fortunately, we’re not that far advanced so as to be outside the scope of leaners.