Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Joe Fraddy en 22 Enero 2015, 06:55 am



Título: alguno me ayuda con un código roto en python?
Publicado por: Joe Fraddy en 22 Enero 2015, 06:55 am
Mi código es el siguiente:

Código
  1. # Funcion 8x9
  2. def obtener_promedio_clase(alumnos):
  3.    puntajes=[]
  4.    alumnos = ['candela', 'milagros', 'ramiro']
  5.    for alumno in alumnos:
  6.        puntajes.append(sacar_promedio(alumno))
  7.    return promedio(puntajes)
  8.  
  9. # Leccion 9x9
  10.    print obtener_promedio_clase(alumnos)
  11.    print calificaciones_con_letras(obtener_promedio_clase(alumnos))

El error: ¡Uy! Probá otra vez. Cuando tratamos de usarlo, vimos que esto estaba roto o que faltaba.

Lo que quiero hacer es mostrá en pantalla (print) el resultado de llamar a obtener_promedio_clase con tu lista de alumnos list. Tus alumnos deben ser [candela, milagros, ramiro] y Después mostrá en pantalla con print el resultado de calificaciones_con_letras para ver el promedio de la clase.


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: engel lex en 22 Enero 2015, 06:59 am
2 cosas...

1- lo ultimo
Código
  1. # Leccion 9x9
  2.    print obtener_promedio_clase(alumnos)
  3.    print calificaciones_con_letras(obtener_promedio_clase(alumnos))

eso está identado... es decir, está dentro de la funcion obtener_promedio_clase

2- y toda la función
Código
  1. sacar_promedio(alumno)
donde está? cómo es?


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: Joe Fraddy en 22 Enero 2015, 07:08 am
2 cosas...

1- lo ultimo
Código
  1. # Leccion 9x9
  2.    print obtener_promedio_clase(alumnos)
  3.    print calificaciones_con_letras(obtener_promedio_clase(alumnos))

eso está identado... es decir, está dentro de la funcion obtener_promedio_clase

2- y toda la función
Código
  1. sacar_promedio(alumno)
donde está? cómo es?

En la segunda cosa que me señalas la estoy sacando de otra función anterior:

Código:
# Funcion 6x9
def sacar_promedio(alumno):
    tareas=promedio(alumno['tareas'])
    pruebas=promedio(alumno['pruebas'])
    examenes=promedio(alumno['examenes'])
    return 0.1 * tareas + 0.3 * pruebas + 0.6 * examenes


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: engel lex en 22 Enero 2015, 07:26 am
ya creo que vi el error...

Código
  1. def obtener_promedio_clase(alumnos):
  2.    puntajes=[]
  3.    alumnos = ['candela', 'milagros', 'ramiro']
  4.    for alumno in alumnos:
  5.        puntajes.append(sacar_promedio(alumno))
  6.    return promedio(puntajes)

alumnos son 3 strings... es decir, 3 palabras... pasas cada nombre como argumento a sacar_promedio

Código
  1. def sacar_promedio(alumno):
  2.    tareas=promedio(alumno['tareas'])
  3.    pruebas=promedio(alumno['pruebas'])
  4.    examenes=promedio(alumno['examenes'])
  5.    return 0.1 * tareas + 0.3 * pruebas + 0.6 * examenes

sacar promedio recibe la palabra y trata de sacar de ella una asociación inexistente...

es decir recibe "candela" e intenta hacer
Código
  1. "candela"['tareas']
cosa que sabes que no funcionará

creo que la implementación debería ser
Código
  1. def sacar_promedio(alumno):
  2.   promedios=promedio(alumno)
  3.   tareas=promedios['tareas']
no se como es tu funcion promedio, pero si asocia el nombre del alumno, lo conseguirá y lo sacará


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: Joe Fraddy en 22 Enero 2015, 21:55 pm
No, en realidad sigue igual, ya le modifique varias cosas pero me sigue dando el mismo error:

Código completo:
Código
  1. candela = {
  2.    "nombre": "Candela",
  3.    "tareas": [90.0, 97.0, 75.0, 92.0],
  4.    "pruebas": [88.0, 40.0, 94.0],
  5.    "examenes": [75.0, 90.0]
  6. }
  7. milagros = {
  8.    "nombre": "Milagros",
  9.    "tareas": [100.0, 92.0, 98.0, 100.0],
  10.    "pruebas": [82.0, 83.0, 91.0],
  11.    "examenes": [89.0, 97.0]
  12. }
  13. ramiro = {
  14.    "nombre": "Ramiro",
  15.    "tareas": [0.0, 87.0, 75.0, 22.0],
  16.    "pruebas": [0.0, 75.0, 78.0],
  17.    "examenes": [100.0, 100.0]
  18. }
  19.  
  20. # ¡Agregá tu función acá abajo!
  21. def promedio (numeros):
  22.    total = sum(numeros)
  23.    total = float(total)
  24.    resultado = total/len(numeros)
  25.    return resultado
  26.  
  27. # Funcion 6x9
  28. def sacar_promedio(alumno):
  29.    tareas=promedio(alumno['tareas'])
  30.    pruebas=promedio(alumno['pruebas'])
  31.    examenes=promedio(alumno['examenes'])
  32.    return 0.1 * tareas + 0.3 * pruebas + 0.6 * examenes
  33.  
  34. # Funcion 7x9
  35. def calificaciones_con_letras(resultado):
  36.    if resultado >=90:
  37.        return "A"
  38.    elif resultado >=80:
  39.        return 'B'
  40.    elif resultado >=70:
  41.        return 'C'
  42.    elif resultado >=60:
  43.        return 'D'
  44.    else:
  45.        return 'F'
  46. print calificaciones_con_letras(sacar_promedio(candela))
  47.  
  48. # Funcion 8x9
  49. def obtener_promedio_clase(alumnos):
  50.    puntajes=[]
  51.    alumnos = ['candela', 'milagros', 'ramiro']
  52.    for alumno in alumnos:
  53.        puntajes.append(sacar_promedio(alumnos))
  54.    return promedio(puntajes)
  55.  
  56. # Leccion 9x9
  57.    print obtener_promedio_clase(alumnos)
  58.    print calificaciones_con_letras(obtener_promedio_clase(alumnos))


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: engel lex en 22 Enero 2015, 22:10 pm
está mal por lo que te dije...

observa

Código
  1. candela = {
  2.    "nombre": "Candela",
  3.    "tareas": [90.0, 97.0, 75.0, 92.0],
  4.    "pruebas": [88.0, 40.0, 94.0],
  5.    "examenes": [75.0, 90.0]
  6. }
  7. alumnos = ['candela', 'milagros', 'ramiro']
  8.  
  9. print(alumnos[0]==candela)

pero ahora al ver el codigo completo, veo que los alumnos están declarados como variables independientes, solo en el array tienes que quitar las comillas de los nombres

es decir

Código
  1. candela = {
  2.    "nombre": "Candela",
  3.    "tareas": [90.0, 97.0, 75.0, 92.0],
  4.    "pruebas": [88.0, 40.0, 94.0],
  5.    "examenes": [75.0, 90.0]
  6. }
  7. alumnos = [candela, milagros, ramiro]
  8.  
  9. print(alumnos[0]==candela)


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: Joe Fraddy en 23 Enero 2015, 01:07 am
Ya lo hice pero me sigue diciendo lo mismo.

podrías modificar mi código de modo que corra???


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: engel lex en 23 Enero 2015, 04:00 am
te recomiendo un debugger de python, es muy bueno... los debugger pueden ayudarte a resolver el 80% de los problemas
http://www.pythontutor.com/visualize.html#mode=edit

a mi tu codigo hasta donde está funciona bien, ya que retorna B


hasta la linea 46 el código corre perfecto... el problema viene a partir de la linea 49

Código
  1. def obtener_promedio_clase(alumnos):
  2.   puntajes=[]
  3.   alumnos = ['candela', 'milagros', 'ramiro']
  4.   for alumno in alumnos:
  5.       puntajes.append(sacar_promedio(alumnos))#la variable del loop es alumno, no alumnos
  6.   return promedio(puntajes)

pero el peor error como te dije está en las ultimas 2 lineas.... al estar identadas (tener espacio a la izquierda) están dentro de obtener_promedio_clase, con quitarle el espacio se corrigen...

ahora... el ultimo error... la ultima linea

Código
  1. print calificaciones_con_letras(obtener_promedio_clase(alumnos))

calificaciones_con_letras requiere como argumento un alumno... le estás pasando alumnos que en ese ámbito ni si quiera existe



Título: Re: alguno me ayuda con un código roto en python?
Publicado por: Joe Fraddy en 23 Enero 2015, 07:25 am
ya corregi la identación, pero ahora el debug me manda lo siguiente:

Código:
Traceback (most recent call last):
  File "python", line 57, in <module>
NameError: name 'alumnos' is not defined


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: engel lex en 23 Enero 2015, 07:45 am
te estás lanzando a preguntar antes de analizar... así que analizemos...

el error es

Citar
Traceback (most recent call last):
  File "python", line 57, in <module>
NameError: name 'alumnos' is not defined

la linea 57 es
Código
  1. print obtener_promedio_clase(alumnos)

dice que alumnos no está declarado... entonces... si el compilador no se equivoca... donde te equivocas tu?

donde declaraste alumnos? el ámbito global (donde haces el print) tiene acceso a esa variable?

esos errores son comunes... aprende a verlos... si no puedes, posiblemente estás muy cansado... aléjate del pc unos 15 minutos, toma agua y vuelve a intentar


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: Joe Fraddy en 23 Enero 2015, 15:59 pm
te estás lanzando a preguntar antes de analizar... así que analizemos...

el error es

la linea 57 es
Código
  1. print obtener_promedio_clase(alumnos)

dice que alumnos no está declarado... entonces... si el compilador no se equivoca... donde te equivocas tu?

donde declaraste alumnos? el ámbito global (donde haces el print) tiene acceso a esa variable?

esos errores son comunes... aprende a verlos... si no puedes, posiblemente estás muy cansado... aléjate del pc unos 15 minutos, toma agua y vuelve a intentar

Ya esta ya corrio, tenias razón llegue a un punto que me desesperé del programa, y si hacía falta declarar la variable alumnos: mi código final quedó así:

Código:
# Leccion 9x9
alumnos=0
print obtener_promedio_clase(alumnos)
print calificaciones_con_letras(obtener_promedio_clase(alumnos))

Gracias por la ayuda!!!!!!


Título: Re: alguno me ayuda con un código roto en python?
Publicado por: engel lex en 23 Enero 2015, 19:00 pm
está bien, porque al final los array en python siempre se pasasn como referencia... pero debiste haber declarado los alumnos afuera para que se viera bien... pero si funciona y así lo debes hacer, excelente!  ;-)