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

Links: notebook, html, PDF, 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, 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 ?

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

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'