1A.e - Correction de l’interrogation écrite du 26 septembre 2015

tests, boucles, fonctions

Enoncé 1

Q1

Le programme suivant provoque une erreur pourquoi ?

[2]:
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 :

[3]:
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, i+1 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 ?

[4]:
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 \rightarrow 5 + 12 + 21 = 38

[5]:
def somme_caracteres(mot):
    s = 0
    for c in mot:
        s += ord(c) - ord("a") + 1
    return s


somme_caracteres("elu")
[5]:
38

On peut l’écrire de façon plus courte :

[6]:
def somme_caracteres(mot):
    return sum(ord(c) - ord("a") + 1 for c in mot)


somme_caracteres("elu")
[6]:
38

Enoncé 2

Q1

Barrez les lignes qui produiraient une erreur à l’exécution et dire pourquoi ?

[7]:
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 ?

[8]:
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.

[9]:
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.

[10]:
def un_sur_deux(mot):
    s = ""
    for i, c in enumerate(mot):
        if i % 2 == 0:
            s += c
    return s


un_sur_deux("python")
[10]:
'pto'

Ou plus court encore :

[11]:
def un_sur_deux(mot):
    return "".join(c for i, c in enumerate(mot) if i % 2 == 0)


un_sur_deux("python")
[11]:
'pto'
[12]:


Notebook on github