1A.e - Correction de l’interrogation écrite du 26 septembre 2015#
Links: notebook
, html, python
, slides, GitHub
tests, boucles, fonctions
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Enoncé 1#
Q1#
Le programme suivant provoque une erreur pourquoi ?
tab = [1, 3]
for i in range(0, len(tab)):
print(tab[i] + tab[i+1])
4
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-4-6893f4ac9402> in <module>()
1 tab = [1, 3]
2 for i in range(0, len(tab)):
----> 3 print(tab[i] + tab[i+1])
IndexError: list index out of range
On découvre le problème en ajoutant des affichages intermédiaires :
tab = [1, 3]
for i in range(0, len(tab)):
print(i, i+1, len(tab))
print(tab[i] + tab[i+1])
0 1 2
4
1 2 2
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-5-58b7566d9294> in <module>()
2 for i in range(0, len(tab)):
3 print(i, i+1, len(tab))
----> 4 print(tab[i] + tab[i+1])
IndexError: list index out of range
A la dernière itération, dévient égal à la longueur de la
liste tab
or le dernier indice d’un tableau est len(tab)-1
.
Q2#
Où est l’erreur de syntaxe ?
n = 1
if n = 1:
y = 0
else:
y = 1
File "<ipython-input-6-2f84bd962211>", line 2
if n = 1:
^
SyntaxError: invalid syntax
Le test d’égalité s’écrit ==
.
Q3#
On associe la valeur 1 à la lettre a, 2 à b et ainsi de suite. Ecrire une fonction qui fait la somme de ces valeurs pour une chaîne de caractères.
Exemple : elu 5 + 12 + 21 = 38
def somme_caracteres(mot):
s = 0
for c in mot :
s += ord(c) - ord("a") + 1
return s
somme_caracteres("elu")
38
On peut l’écrire de façon plus courte :
def somme_caracteres(mot):
return sum(ord(c) - ord("a") + 1 for c in mot)
somme_caracteres("elu")
38
Enoncé 2#
Q1#
Barrez les lignes qui produiraient une erreur à l’exécution et dire pourquoi ?
y = "a" * 3 + 1
z = 3 * "a" + 1
print(y,z)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-225cea37f121> in <module>()
----> 1 y = "a" * 3 + 1
2 z = 3 * "a" + 1
3 print(y,z)
TypeError: Can't convert 'int' object to str implicitly
Les deux premières lignes sont incorrects car on essaye d’ajouter une
chaîne de caractères à un nombre. La première opération est correcte
"a" * 3
. Dans un sens comme dans l’autre, elle donne "aaa"
. Mais
on ne peut ajouter 1 à "aaa"
.
Q2#
Que vaut l
à la fin du programme ?
l = []
for i in range(0, 10):
l.append([i])
print(l)
[[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]
Il ne faut pas confondre la méthode append et extend.
l = []
for i in range(0, 10):
l.extend([i])
print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Q3#
Ecrire une fonction qui prend une chaîne de caractères et qui lui enlève une lettre sur 2.
def un_sur_deux(mot):
s = ""
for i,c in enumerate(mot):
if i % 2 == 0:
s += c
return s
un_sur_deux("python")
'pto'
Ou plus court encore :
def un_sur_deux(mot):
return "".join( c for i,c in enumerate(mot) if i % 2 == 0 )
un_sur_deux("python")
'pto'