# Exercise 8

#1

``````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]
}

def average(numbers):
total = sum(numbers)
total = float(total)
total = total / len(numbers)

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

if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
elif score >= 60:
return "D"
else:
return "F"

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

#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

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 ...

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 ? 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

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"...

PS: I despair ... 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

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

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

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...

#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 j'ai pu terminer ^^