Exercise 8


#1

Hey
https://www.codecademy.com/courses/python-beginner-en-qzsCL/1/4?curriculum_id=4f89dab3d788890003000096

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)
    total = total / len(numbers)
    return total
    
def get_average(student):
    homework = average(student["homework"])
    quizzes = average(student["quizzes"])
    tests = average(student["tests"])
    return homework * 0.10 + quizzes * 0.30 + tests * 0.60
    
def get_letter_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
    else:
        return "F"

print get_letter_grade(get_average(lloyd))

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

My pythons shocking but this is the error message

File "python", line 53
SyntaxError: 'return' outside function
But if I move it anywhere else it says unexpected indent or outside function.
this line
for student in students:
also confuses me and doesn't work a lot
Any help would be appreciated :slightly_smiling:


#2

Hi
some indentation is needed for the function get_class_average:

the loop for student in students: must be aligned with results = [] and the next lines must also be modified:

def get_class_average(students):
    results = []
    for student in students:   # added indentation here
        get_average(student)          # and here
        results.append(get_average(student))   # and here
    return average(results)

then the return average(results) is included in the get_class_average. In your case, this return was outside of the function because the loop for was not indented, so that the function get_class_average was finished after the line results = []. Extreme care must be taken with indentation with Python


#3

Thank you this worked!


#4

Hi, i'm french

Sorry for the French translation made on google :slightly_smiling:

I test your code without success and I'm still stuck. impossible to know what blocks.

I put a message on the forum but have had no response. Can you help me ? Thank you !: )

@thebelgian1


#5

Bonjour

est-ce qu'il y a un message d'erreur qui s'affiche? Si oui, est-ce le même que benjnev, un problème d'alignement du code? Si oui, il faut savoir que Python est assez pointilleux quant à l'alignement du code.
Tout ce qui se trouve dans une fonction doit être décalé par rapport à la définition du nom de la fonction
Tout ce qui se trouve dans une boucle for ou dans un if/elseif/else doit aussi être décalé par rapport à la première ligne de la boucle/if/elseif/else.

S'il s'agit d'un autre message d'erreur, est-ce que vous pouvez me le recopier, svp? Votre code Python serait aussi utile. Ce serait sympa de copier le code entre trois backtildes ` ouvrant et trois backtildes fermant, ou alors utiliser la fonction "preformatted text" proposé lors de la rédaction du message ( </> )


#6

Hello, I repost what I post once ... :slightly_smiling:

My English is very bad but if anyone can help me I try my luck ... I have to spend my afternoon yesterday without success and the message I posted on the forum remains unanswered. Thank you in advance for your help !

A solution ? :slightly_smiling: Merci !

Here is my code !!

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

def moyenne(nombres):
somme = sum(nombres)
somme = float(somme)
taille = len(nombres)
taille = float(taille)
total = somme/taille
return total

def average(nombres):
total = sum(nombres)
total = float(total)
average = total / len(nombres)
return average

def calcule_moyenne(etudiant):
devoirs = average(etudiant['devoirs'])
quiz = average(etudiant['quiz'])
tests = average(etudiant['tests'])
note = 0.1 * devoirs + 0.3 * quiz + 0.6 * tests
return note

def ecrire_lettre_note(note):
if note >= 90:
return "A"
elif note >= 80:
return "B"
elif note >= 70:
return "C"
elif note >= 60:
return "D"
else:
return "F"
print ecrire_lettre_note(calcule_moyenne(lloyd))

def calcule_classe_moyenne(etudiants):
resultats = []
for etudiant in etudiants:
resultats.append(calcule_classe_moyenne(etudiant))
return moyenne(resultats)

print calcule_classe_moyenne(resultats)
print ecrire_lettre_note(note)

and this is what gives me the console :

B
Traceback (most recent call last):
File "python", line 61, in
NameError: name 'resultats' is not defined

Before that the other code told me that there was a fault on "alice"...

Thanks for your help... :slightly_smiling:

PS: I despair :confused: ... it's been two days that I'm on to take my head ...


#7

P.P.S : les indentations sont normalement bonnes... je ne pense pas que ça vienne de là...

P.P.S: indents are normally good ... I do not think it comes from there ...


#8

salut,

Le code est correct jusque après la définition de la fonction calcule_classe_moyenne. Le problème apparaît quand tu veux afficher la moyenne de la classe avec la ligne print calcule_classe_moyenne(resultats). La variable resultats n'est définie que dans la fonction calcule_classe_moyenne. Ce qui est disponible pour l'instant, c'est lloyd, alice et tyler.
Il faut plutôt faire appel à cette fonction avec comme paramètre une liste composée de lloyd, alice et tyler. Le mieux est d'enregistrer le résultat dans une nouvelle variable note (note est pour l'instant aussi indéfinie) et d'ensuite appeler la fonction ecrire_lettre_note(note) sans le print car le print est déjà fait à l'intérieur de ecrire_lettre_note


#9

Hello ,

I have not understood everything ... I have to make a

def students (lloyd, alice, tyler)?


salut,

j'ai pas tout compris... Je dois faire un

def etudiants(lloyd, alice, tyler) ?


#10

salut,
Toutes tes fonctions sont correctement écrites, il ne reste plus qu'à les appeler à partir du programme principal. Dans le programme principal, les variables lloyd, alice et tyler sont définies. Le programme principal, c'est tout ce qui concerne le code qui n'a pas d'indentation. Donc tout ce qu'il te reste à faire à la place de tes deux dernières lignes

print calcule_classe_moyenne(resultats)
print ecrire_lettre_note(note)

c'est de créer une liste qui contient les étudiants, d'appeler get_class_average avec cette liste en paramètre. Le résultat de get_class_average est enregistré dans une nouvelle variable (note_classe par exemple). Ensuite il suffit de faire un print de note_classe et de get_letter_grade(note_classe). Il ne faut pas créer une nouvelle fonction def etudiants comme tu le proposes.

Dans ton code à toi, resultats et note sont des variables définies dans des fonctions et ne sont donc pas accessibles à partir du programme principal. D'où le message d'erreur NameError: name 'resultats' is not defined


#11

merci :slightly_smiling:

j'ai toujours un message d'erreur ... :confused:


la console dit :

File "python", line 52
SyntaxError: 'return' outside function


#12

Bonjour,
J'appelle Andrew et je suis American et en la classe de francais 2. Je fini avec le problem en anglais et je moyenne avec le langue de francais. Avec-Quelle tu veux adies?


#13

Est-ce que tu pourrais copier/coller ici ton code sous forme encodée? Ceci me permettra plus facilement de voir où se trouve le problème. Pour écrire un code sous forme encodée dans un message, je te réfère au lien suivant qui explique comment faire

Ceci permettra d'avoir le code bien organisé et donc lisible


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


def moyenne(nombres):
    somme = sum(nombres)
    somme = float(somme)
    taille = len(nombres)
    taille = float(taille)
    total = somme/taille
    return total

def calcule_moyenne(etudiant):
    devoirs = average(etudiant['devoirs'])
    quiz = average(etudiant['quiz'])
    tests = average(etudiant['tests'])
    note = 0.1 * devoirs + 0.3 * quiz + 0.6 * tests
    return note

def ecrire_lettre_note(note):
    if note >= 90:
        return "A"
    elif note >= 80:
        return "B"
    elif note >= 70:
        return "C"
    elif note >= 60:
        return "D"
    else:
        return "F"

def calcule_classe_moyenne(etudiants):
    resultats = []
    for etudiant in etudiants:
        resultats.append(calcule_classe_moyenne(etudiant))
    return moyenne(resultats)

def etudiants (lloyd,alice,tyler):
    print calcule_classe_moyenne(etudiants)
    print ecrire_lettre_note(calcule_classe_moyenne(etudiants))

#15

Ha j'ai finalement trouvé ce qui ne marchait pas dans ton code: le problème dans la fonction calcule_classe_moyenne est que dans resultats, tu emmagasines des valeurs calculées à partir de la mauvaise fonction. Tu as créé une fonction itérative qui s'appelle elle-même. A la place de

resultats.append(calcule_classe_moyenne(etudiant))

écris plutôt

resultats.append(calcule_moyenne(etudiant))

Pour visualiser le résultats; utilise plutôt

print calcule_classe_moyenne([lloyd,alice,tyler])

à la place de ta dernière fonction etudiants(lloyd,alice,tyler)


#16
File "python", line 53
    classe_moy = calcul_classe_moyenne([lloyd, alice, tyler)
                                                           ^
SyntaxError: invalid syntax

Toujours une erreur... :confused:


#17

salut
cette erreur me paraît assez évidente : il manque la parenthèse carrée ] qui ferme la liste juste après tyler. Remarque le petit chapeau ^ qui indique l'emplacement de l'erreur.


#18

merci :slight_smile: j'ai pu terminer ^^