<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Tuples et listes</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Types construits : tuples (immuables) et listes<br/>
(mutables), création, accès par indice, parcours,<br/>
ajout avec append, longueur avec len, tranches,<br/>
différences entre tuples et listes, cas d'usage,<br/>
découpage (<em>slicing</em>), affectation multiple.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q01 : Création d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment crée-t-on une <strong>liste</strong> vide en<br/>
Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois conteneurs natifs principaux<br/>
sont à distinguer : les listes<br/>
(avec []), les tuples (avec<br/>
()) et les dictionnaires (avec<br/>
{}). Ils diffèrent par leur<br/>
mutabilité, leur ordre et leur<br/>
mode d'accès.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec la syntaxe liste = []</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On utilise les crochets pour<br/>
délimiter une liste. Une forme<br/>
équivalente consiste à écrire<br/>
liste = list().</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe liste = ()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe crée un <strong>tuple</strong><br/>
vide, et non une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe liste = {}</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les accolades sont utilisées<br/>
pour les <strong>dictionnaires</strong> ou<br/>
les ensembles, et non pour les<br/>
listes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe liste = null</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot-clé null n'existe pas<br/>
en Python ; l'équivalent<br/>
s'appelle None, qui ne<br/>
représente d'ailleurs pas une<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q02 : Création d'un tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment crée-t-on un <strong>tuple</strong> en<br/>
Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une distinction subtile : (1) est<br/>
simplement l'entier 1 entouré<br/>
de parenthèses de groupement,<br/>
tandis que (1,) est un tuple à<br/>
un seul élément. C'est la<br/>
virgule, et non les parenthèses,<br/>
qui crée le tuple.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec t = tuple[1, 2, 3], crochets après le mot tuple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tuple[...] avec des crochets<br/>
est une annotation de type, pas une<br/>
création de tuple. Pour convertir une<br/>
liste, on écrit tuple([1, 2, 3]).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec t = (1, 2, 3), ou même t = 1, 2, 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les parenthèses sont<br/>
souvent facultatives ; ce sont les<br/>
virgules qui définissent un tuple. Le<br/>
tuple vide s'écrit () et, pour un<br/>
seul élément, la virgule est<br/>
obligatoire : t = (1,).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec t = {1, 2, 3}, les accolades regroupant les éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les accolades autour de<br/>
plusieurs éléments séparés par des<br/>
virgules créent un <strong>ensemble</strong>, un<br/>
autre type de collection qui n'est<br/>
pas au programme de première, et<br/>
non un tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec t = [1, 2, 3], puis t.freeze() pour le figer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les crochets créent une liste,<br/>
et aucune méthode freeze n'existe. La<br/>
conversion se fait avec tuple(liste).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q03 : Mutabilité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la <strong>différence fondamentale</strong> entre un tuple et<br/>
une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La mutabilité désigne la<br/>
possibilité d'être modifié.<br/>
L'instruction liste.append(x)<br/>
modifie la liste sur place. Sur<br/>
un tuple, l'appel<br/>
tuple.append(x) provoque une<br/>
exception AttributeError.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple contient forcément exactement deux éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune contrainte sur le<br/>
nombre d'éléments : un tuple<br/>
peut en contenir zéro, un, ou<br/>
beaucoup.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence, seule la notation change</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la notation diffère, mais<br/>
surtout le comportement : une liste se<br/>
modifie sur place, un tuple jamais.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste est modifiable, le tuple ne l'est pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une liste est<br/>
<strong>mutable</strong>, un tuple <strong>immuable</strong><br/>
(figé). En conséquence, les tuples<br/>
peuvent être utilisés comme<br/>
clés de dictionnaire, ce que<br/>
les listes ne peuvent pas<br/>
faire. Les tuples sont<br/>
également un peu plus rapides<br/>
à manipuler.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple ne contient que des nombres, une liste tout type</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tuple accepte n'importe quels<br/>
objets, comme une liste (("a", 1, [2])<br/>
est valide). La différence concerne la<br/>
mutabilité.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q04 : Accès par indice</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie l'expression<br/>
["a", "b", "c"][1] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une indexation négative est aussi<br/>
possible : liste[-1] désigne le<br/>
dernier élément, liste[-2]<br/>
l'avant-dernier, et ainsi de<br/>
suite. C'est très utile pour<br/>
accéder à la fin d'une liste sans<br/>
avoir à connaître sa longueur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne "c"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La chaîne "c" se trouve à<br/>
l'indice 2, et non à<br/>
l'indice 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La chaîne "b"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'indice 1 correspond au<br/>
deuxième élément de la liste.<br/>
C'est la convention standard<br/>
des langages indexés à partir<br/>
de 0.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne "a"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>En Python, l'indexation<br/>
commence à 0. L'élément<br/>
d'indice 0 est donc "a",<br/>
et l'élément d'indice 1 est<br/>
"b".</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception est levée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'indice 1 est valide pour<br/>
une liste de trois éléments :<br/>
aucune exception n'est levée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q05 : Longueur d'une séquence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment obtient-on la <strong>longueur</strong><br/>
d'une liste ou d'un tuple ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La fonction len s'exécute en<br/>
O(1), car la longueur est<br/>
stockée à part. L'expression<br/>
len([]) vaut 0, ce qui<br/>
permet de tester rapidement si<br/>
une liste est vide.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste.size()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode size n'existe<br/>
pas en Python. Elle vient du<br/>
monde C++.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste.length</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'attribut length n'existe<br/>
pas en Python. Cette syntaxe<br/>
provient de JavaScript ou de<br/>
Java.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec len(liste)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction native len<br/>
fonctionne sur tous les<br/>
conteneurs standard : listes,<br/>
tuples, chaînes,<br/>
dictionnaires, ensembles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec size(liste)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune fonction size<br/>
n'existe dans la<br/>
bibliothèque standard de<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q06 : Ajouter à une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>ajoute-t-on</strong> l'élément<br/>
42 à la fin d'une liste liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Différence importante : la<br/>
méthode append modifie la<br/>
liste sur place, alors que<br/>
l'opérateur + crée une<br/>
nouvelle liste. Pour ajouter<br/>
plusieurs éléments d'un coup, on<br/>
écrit liste = liste + [4, 5, 6].</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste += 42</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'opérateur += attend un<br/>
itérable, pas un entier.<br/>
L'écriture liste += [42]<br/>
fonctionnerait, mais reste<br/>
moins idiomatique<br/>
qu'append.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste = liste + 42</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'opérateur + ne sait pas<br/>
combiner une liste avec un<br/>
entier ; il déclenche une<br/>
exception TypeError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec liste.append(42)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette méthode modifie la<br/>
liste sur place. Par<br/>
exemple, après<br/>
liste = [1, 2]; liste.append(3),<br/>
la liste vaut [1, 2, 3].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste.add(42)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode add est définie<br/>
pour les ensembles, mais pas<br/>
pour les listes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q07 : Parcours d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>parcourt-on</strong> tous les<br/>
éléments d'une liste pour les<br/>
afficher ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour parcourir une liste avec un<br/>
indice, on écrit<br/>
for i in range(len(liste)):.<br/>
On dispose alors à la fois de<br/>
l'indice i et de la valeur<br/>
liste[i] à chaque tour de boucle.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for i in liste.length:<br/>
    print(liste[i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'attribut length n'existe<br/>
pas en Python, et<br/>
for i in nombre: n'est pas<br/>
une syntaxe valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
print liste<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe correspond à<br/>
Python 2. En Python 3,<br/>
print est une fonction et<br/>
requiert des parenthèses.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for x in liste:<br/>
    print(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est la forme idiomatique<br/>
en Python. La variable x<br/>
reçoit successivement chacun<br/>
des éléments de la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
while liste:<br/>
    print(liste)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette boucle est infinie tant<br/>
qu'on ne retire pas des<br/>
éléments à la liste, et elle<br/>
n'affiche pas les éléments<br/>
un par un.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q08 : Test d'appartenance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment teste-t-on si l'élément<br/>
42 est présent dans une liste<br/>
liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux méthodes utiles existent<br/>
par ailleurs : liste.index(42)<br/>
renvoie l'indice de la première<br/>
occurrence, ou lève une<br/>
exception ValueError si<br/>
l'élément n'est pas présent ;<br/>
liste.count(42) compte le<br/>
nombre d'occurrences.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste.has(42)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune méthode de ce nom<br/>
n'existe pour les listes en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec 42 in liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'opérateur in renvoie un<br/>
booléen indiquant la<br/>
présence ou l'absence de<br/>
l'élément. Sur une liste,<br/>
cette opération s'exécute en<br/>
O(n) par parcours.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste.find(42)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode find est définie<br/>
pour les chaînes de<br/>
caractères, mais pas pour les<br/>
listes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec liste.contains(42)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode contains<br/>
n'existe pas en Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q09 : Quand utiliser un tuple ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans quel cas préfère-t-on un<br/>
<strong>tuple</strong> à une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas d'usage typiques d'un tuple :<br/>
coordonnées comme (x, y),<br/>
retours multiples d'une fonction<br/>
avec return a, b, ou<br/>
enregistrement comme<br/>
("Alice", 17, "Lyon").</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement pour stocker des valeurs numériques entières</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune restriction sur le<br/>
type des éléments. Un tuple<br/>
peut contenir des chaînes,<br/>
des objets, ou tout autre<br/>
type.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour des données qui ne doivent pas être modifiées (constantes, coordonnées)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le tuple offre la sécurité<br/>
(l'immuabilité empêche les<br/>
modifications<br/>
accidentelles), une légère<br/>
efficacité supplémentaire,<br/>
et permet l'usage comme clé<br/>
de dictionnaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour économiser quelques touches au clavier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette motivation est trop<br/>
superficielle. Le choix<br/>
entre tuple et liste est<br/>
d'abord d'ordre conceptuel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour stocker des données qui changent souvent au cours du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour des données dynamiques,<br/>
la liste est plus adaptée<br/>
puisqu'elle est mutable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q10 : Trace simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que produit ce code ?<br/>
`<code>python<br/>
l = [1, 2, 3]<br/>
l.append(4)<br/>
print(len(l))<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La méthode append modifie la<br/>
liste sur place. Il ne faut pas<br/>
écrire l = l.append(4) :<br/>
append ne renvoie rien (la<br/>
valeur renvoyée est None),<br/>
donc l se retrouverait à<br/>
None.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On ajoute un seul élément<br/>
à une liste qui en contenait<br/>
trois : la longueur passe<br/>
de 3 à 4, et non à 5.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette réponse ignore l'ajout<br/>
de l'élément 4 par la<br/>
méthode append.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche 4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La liste initiale est<br/>
[1, 2, 3]. Après<br/>
l.append(4), elle vaut<br/>
[1, 2, 3, 4], donc sa<br/>
longueur est 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code est parfaitement<br/>
valide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q11 : Découpage d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie l'expression<br/>
[1, 2, 3, 4, 5][1:4] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention Python : la borne<br/>
basse est incluse, la borne<br/>
haute est exclue. C'est cohérent<br/>
avec range(a, b). Une borne<br/>
omise vaut le début ou la fin :<br/>
[1, 2, 3, 4, 5][:2] donne<br/>
[1, 2] et [1, 2, 3, 4, 5][2:]<br/>
donne [3, 4, 5].</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'indice 1 commence au<br/>
deuxième élément. La borne<br/>
basse est inclusive, donc<br/>
on commence par l'élément à<br/>
l'indice 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste [2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La syntaxe liste[a:b]<br/>
extrait les éléments de<br/>
l'indice a (inclus) à<br/>
l'indice b (exclu). Les<br/>
indices 1, 2 et 3<br/>
correspondent ici aux<br/>
éléments 2, 3 et 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [1, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le découpage extrait une<br/>
tranche continue, et non<br/>
deux éléments isolés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [2, 3, 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La borne haute est<br/>
<strong>exclue</strong> par convention.<br/>
On ne prend donc pas<br/>
l'élément d'indice 4<br/>
(qui est 5).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q12 : Affectation multiple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelles sont les valeurs de a,<br/>
b et c après l'instruction<br/>
(a, b, c) = (1, 2, 3) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une variante plus avancée<br/>
utilise l'astérisque pour<br/>
capturer une partie variable :<br/>
a, *reste = [1, 2, 3, 4]<br/>
affecte a = 1 et<br/>
reste = [2, 3, 4].</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tuple ((1, 2, 3),)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune imbrication ne se<br/>
produit ici. Chaque variable<br/>
reçoit une seule valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a = 1, b = 1, c = 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'affectation multiple<br/>
attribue chaque valeur du<br/>
tuple de droite à la variable<br/>
correspondante de gauche, et<br/>
non la même valeur à toutes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>a = 1, b = 2, c = 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est ce qu'on appelle le<br/>
<strong>dépaquetage</strong> d'un tuple.<br/>
Les parenthèses peuvent<br/>
être omises :<br/>
a, b, c = 1, 2, 3. Cette<br/>
écriture est très utile,<br/>
notamment pour échanger<br/>
deux variables :<br/>
a, b = b, a.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception est levée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code est parfaitement<br/>
valide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q13 : Retirer le dernier élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de l = [10, 20, 30]. Quelle expression<br/>
fournit une <strong>nouvelle</strong> liste contenant tous les<br/>
éléments de l sauf le dernier, quelle que soit la<br/>
longueur de l ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans une tranche l[debut:fin], la borne de fin est<br/>
exclue et peut être négative : l[:-1] s'arrête<br/>
juste avant le dernier élément. Le résultat est une<br/>
nouvelle liste, la liste d'origine reste intacte.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>l[1:]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette tranche part de l'indice 1 et<br/>
retire donc le <strong>premier</strong> élément. Sur<br/>
l'exemple, elle vaut [20, 30].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>l[:-1]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la borne haute -1 désigne le<br/>
dernier élément, exclu de la tranche. On obtient<br/>
[10, 20] dans une nouvelle liste ; l n'est<br/>
pas modifiée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>l[:-2]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne haute étant exclue, -2<br/>
retire les <strong>deux</strong> derniers éléments. Sur<br/>
l'exemple, la tranche vaut [10].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>l[-1]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans deux-points, les crochets font un<br/>
accès par indice, pas une tranche. l[-1] est<br/>
le dernier élément lui-même, ici 30.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q14 : Piège de la valeur par défaut mutable</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>``python<br/>
def f(l=[]):<br/>
    l.append(1)<br/>
    return l</p>
<p>print(f())<br/>
print(f())<br/>
``<br/>
Quel est le résultat de l'exécution<br/>
de ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est l'un des plus célèbres<br/>
pièges de Python. Il découle<br/>
directement de la mutabilité<br/>
des listes et de la manière<br/>
dont Python évalue les valeurs<br/>
par défaut.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code><br/>
[1]<br/>
[1]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette réponse ignore le fait<br/>
que la valeur par défaut est<br/>
partagée entre les appels<br/>
successifs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code><br/>
[]<br/>
[]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette réponse ignore les<br/>
appels à append, qui<br/>
ajoutent bien un élément<br/>
à chaque appel de f.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code><br/>
[1]<br/>
[1, 1]<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La liste par défaut est créée<br/>
<strong>une seule fois</strong>, à la<br/>
définition de la fonction.<br/>
Les appels successifs<br/>
partagent donc la même<br/>
liste. Pour éviter ce<br/>
piège, on écrit l=None,<br/>
puis dans la fonction<br/>
if l is None: l = [].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception est levée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code est parfaitement<br/>
valide ; aucune exception<br/>
n'est levée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q15 : Méthodes sort et sorted</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre<br/>
liste.sort() et sorted(liste) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Moyen mnémotechnique : sorted<br/>
(« trié ») désigne un résultat,<br/>
une nouvelle liste triée<br/>
renvoyée sans modifier<br/>
l'original ; sort (« trier »)<br/>
désigne une action, qui modifie<br/>
la liste sur place et renvoie<br/>
None.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La méthode sort est nettement plus lente à l'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux ont une<br/>
performance équivalente.<br/>
La différence porte sur<br/>
la modification, ou non,<br/>
de la liste d'origine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence, sorted(liste) appelle liste.sort()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sorted construit une<br/>
<strong>nouvelle</strong> liste triée sans toucher à<br/>
l'original ; sort modifie la liste sur<br/>
place et renvoie None.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction sorted ne fonctionne que sur des nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction sorted<br/>
fonctionne sur tout type<br/>
comparable (entiers,<br/>
chaînes, tuples, etc.).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>sort modifie la liste, sorted renvoie une copie triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sort trie sur place<br/>
et renvoie None, sorted renvoie une<br/>
nouvelle liste. Le choix dépend du besoin :<br/>
si l'on veut conserver<br/>
l'original, on utilise<br/>
sorted ; sinon, sort<br/>
est préférable. La<br/>
fonction sorted<br/>
fonctionne aussi sur les<br/>
tuples, contrairement à<br/>
sort.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q16 : Compréhension de liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle expression construit la liste<br/>
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]<br/>
des carrés des entiers de 1 à 10 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une compréhension de liste<br/>
[expression for i in range(a, b)] construit<br/>
la liste des valeurs de l'expression pour i<br/>
allant de a à b - 1. Elle équivaut à une<br/>
boucle qui part d'une liste vide et ajoute<br/>
chaque valeur avec append. Les deux erreurs<br/>
classiques sont de confondre <em> et </em>*, et<br/>
de se tromper sur les bornes de range.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[i ** 2 for i in range(1, 11)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : range(1, 11) parcourt les<br/>
entiers de 1 à 10 inclus, et i ** 2<br/>
calcule le carré de chacun. La compréhension<br/>
rassemble ces dix carrés dans une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[i * 2 for i in range(1, 11)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : i <em> 2 est le double de i, pas<br/>
son carré. Cette expression construit<br/>
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20].<br/>
Le carré s'écrit i </em><em> 2 ou i </em> i.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[i ** 2 for i in range(10)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(10) commence à 0 et<br/>
s'arrête à 9. Cette expression construit<br/>
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] :<br/>
le carré de 0 est en trop, celui de 10<br/>
manque.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[i ** 2 for i in range(1, 10)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne de fin de range est<br/>
exclue, donc range(1, 10) s'arrête à<br/>
9. Cette expression construit<br/>
[1, 4, 9, 16, 25, 36, 49, 64, 81], sans<br/>
le carré de 10.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q17 : Référence et copie</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
a = [1, 2, 3]<br/>
b = a<br/>
b.append(4)<br/>
print(a)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est la notion essentielle<br/>
d'<strong>alias</strong> : deux variables<br/>
peuvent désigner le même<br/>
objet. Ce comportement diffère<br/>
des types immuables comme les<br/>
entiers, où b = a n'a pas<br/>
cet effet.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode append<br/>
ajoute à la liste<br/>
existante, sans la<br/>
remplacer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'affectation b = a ne<br/>
crée pas une copie, mais<br/>
attribue une nouvelle<br/>
référence vers la même<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception est levée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code est parfaitement<br/>
valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste [1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les variables a et b<br/>
désignent le <strong>même</strong> objet<br/>
en mémoire. Modifier l'un<br/>
revient à modifier<br/>
l'autre. Pour faire une<br/>
copie, on utilise<br/>
b = a.copy() ou<br/>
b = a[:].</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q18 : Réaffecter la variable de boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
l = [1, 2, 3]<br/>
for x in l:<br/>
    x = x * 2<br/>
print(l)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour transformer les éléments d'une liste, on<br/>
parcourt les indices et on écrit dans la liste :<br/>
for i in range(len(l)): l[i] = l[i] * 2. La<br/>
variable x d'un for x in l n'est qu'un nom<br/>
temporaire posé sur chaque élément.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche [2, 4, 6]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : x = x <em> 2 crée un nouvel entier et le<br/>
range dans x, sans rien écrire dans la liste.<br/>
Pour doubler les éléments, il faut écrire<br/>
l[i] = l[i] </em> 2 en parcourant les indices.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : réaffecter la variable de boucle<br/>
ne modifie jamais la liste. À chaque tour, x<br/>
désigne un élément, puis reçoit un nouvel<br/>
entier ; la liste n'est pas touchée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3, 2, 4, 6]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune instruction n'ajoute d'élément<br/>
à l. Seule la méthode append allongerait la<br/>
liste ; ici on ne fait que réaffecter x.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une erreur, car la liste est modifiée pendant le parcours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste n'est justement pas modifiée,<br/>
et réaffecter la variable de boucle est de toute<br/>
façon autorisé. Le code s'exécute sans erreur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q19 : Tuple comme clé de dictionnaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi un tuple peut-il être<br/>
utilisé comme <strong>clé</strong> de<br/>
dictionnaire, alors qu'une liste<br/>
ne le peut pas ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un objet est dit <em>hashable</em><br/>
lorsqu'il possède une<br/>
empreinte stable et peut<br/>
donc être placé dans un<br/>
ensemble ou utilisé comme<br/>
clé. Les types immuables<br/>
classiques sont hashables :<br/>
entiers, flottants, chaînes,<br/>
tuples (s'ils ne contiennent<br/>
que des éléments hashables)<br/>
et ensembles figés.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune des deux structures ne peut servir de clé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un tuple peut bien servir<br/>
de clé, à condition que<br/>
tous ses éléments soient<br/>
eux-mêmes immuables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune raison particulière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La distinction repose sur<br/>
des considérations<br/>
techniques précises, comme<br/>
expliqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'un tuple est immuable : il a une empreinte de hachage stable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les clés de dictionnaire<br/>
doivent être stables dans<br/>
le temps. Une liste,<br/>
mutable, ne pourrait pas<br/>
servir de clé : on<br/>
pourrait modifier la clé<br/>
après l'insertion, ce qui<br/>
casserait la table de<br/>
hachage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement pour des raisons purement historiques et anciennes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La raison est strictement<br/>
technique, et non<br/>
historique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q20 : Tuple à un élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut l'expression len((42)) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est un piège classique : il<br/>
faut toujours penser à la<br/>
virgule pour les tuples à un<br/>
seul élément. Pour vérifier,<br/>
type((42)) renvoie int,<br/>
tandis que type((42,))<br/>
renvoie tuple.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur 0, car le tuple (42) est considéré comme vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : (42) n'est pas un tuple du<br/>
tout, et len lève une exception sur un<br/>
entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une exception TypeError</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : (42) n'est pas un tuple<br/>
mais l'entier 42 entre parenthèses, et<br/>
len n'agit pas sur un entier. Pour créer<br/>
un tuple à un seul élément, il faut une<br/>
virgule : (42,).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur 42, l'unique élément du tuple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : len ne renvoie pas la valeur<br/>
de son argument, et (42) n'est pas un<br/>
tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur entière 1, comme on pourrait l'attendre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'expression (42) n'est<br/>
pas un tuple, mais<br/>
simplement l'entier 42<br/>
entouré de parenthèses de<br/>
groupement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q21 : Alias et concaténation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
l = [1, 2, 3]<br/>
m = l<br/>
l = l + [4]<br/>
print(m)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux façons d'allonger une liste n'ont pas le même<br/>
effet sur les alias : l.append(4) et l += [4]<br/>
modifient la liste partagée, visible depuis m ;<br/>
l = l + [4] réaffecte l à une nouvelle liste<br/>
et rompt le lien avec m.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'alias m suivrait l si la liste<br/>
était modifiée sur place, par l.append(4) ou<br/>
l += [4]. Mais l + [4] construit une<br/>
<strong>nouvelle</strong> liste, que l reçoit ; m désigne<br/>
toujours l'ancienne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3, [4]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'opérateur + concatène les éléments<br/>
sans imbriquer la liste [4], et surtout il<br/>
produit une nouvelle liste : m n'en voit rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : après m = l, les deux noms<br/>
désignent la même liste. Puis l + [4] crée<br/>
une nouvelle liste [1, 2, 3, 4], affectée à<br/>
l seul. m garde l'ancienne liste, intacte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une erreur, car on ne peut pas additionner deux listes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : + entre deux listes est défini et<br/>
produit leur concaténation. Seule l'addition<br/>
d'une liste et d'un entier, comme l + 4,<br/>
lève TypeError.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q22 : Liste de listes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
grille = [[0] <em> 3] </em> 3<br/>
grille[0][0] = 1<br/>
print(grille)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est un piège classique. La<br/>
bonne pratique consiste à<br/>
utiliser une compréhension de<br/>
liste pour créer chaque<br/>
sous-liste indépendamment.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[[1, 0, 0], [1, 0, 0], [1, 0, 0]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'expression [[0]<em>3]</em>3<br/>
crée trois références<br/>
vers la même sous-liste.<br/>
Modifier une sous-liste<br/>
revient donc à modifier<br/>
les trois. La solution<br/>
consiste à utiliser une<br/>
compréhension de liste :<br/>
[[0] * 3 for _ in range(3)].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception est levée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code est parfaitement<br/>
valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[[1, 0, 0], [0, 0, 0], [0, 0, 0]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette réponse ignore que<br/>
les trois sous-listes<br/>
référencent le même objet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[[0, 0, 0], [0, 0, 0], [0, 0, 0]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On a affecté<br/>
grille[0][0] = 1, donc<br/>
la valeur 1 apparaît<br/>
quelque part dans le<br/>
résultat.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q23 : Corriger une note dans une liste de p-uplets</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Les notes d'une classe sont rangées dans<br/>
eleves = [("Ana", 12), ("Bilal", 9), ("Chloé", 15)],<br/>
un p-uplet par élève. La note de Bilal est<br/>
fausse, il a eu 11. Quelle instruction<br/>
corrige la liste sans erreur ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans une liste de p-uplets, chaque enregistrement<br/>
est immuable, mais la liste qui les contient est<br/>
mutable. Pour corriger un champ, on construit un<br/>
nouveau p-uplet et on l'affecte à l'indice voulu :<br/>
eleves[1] = ("Bilal", 11). Toute tentative de<br/>
modifier le p-uplet sur place lève une exception.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>eleves[1][1] = 11</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : eleves[1] est le p-uplet<br/>
("Bilal", 9), et un p-uplet est immuable.<br/>
Python lève<br/>
TypeError: 'tuple' object does not support item assignment.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>eleves[1] = ("Bilal", 11)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on ne modifie pas le p-uplet,<br/>
on le remplace. La liste, elle, est mutable :<br/>
l'affectation range un nouveau p-uplet à<br/>
l'indice 1, et la liste vaut<br/>
[("Ana", 12), ("Bilal", 11), ("Chloé", 15)].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>eleves["Bilal"] = 11</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste s'indexe par un entier,<br/>
pas par une chaîne ; cette écriture est celle<br/>
d'un dictionnaire. Python lève<br/>
TypeError: list indices must be integers or slices, not str.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>eleves[1].append(11)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : eleves[1] est un p-uplet, qui n'a<br/>
pas de méthode append. Python lève<br/>
AttributeError: 'tuple' object has no attribute 'append'.<br/>
Et même sur une liste, on aurait ajouté 11<br/>
au lieu de remplacer 9.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q24 : Tuples pour les constantes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour stocker des <strong>constantes</strong><br/>
que l'on ne modifiera jamais,<br/>
quelle structure est la plus<br/>
indiquée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention Python : on<br/>
utilise les tuples pour les<br/>
données figées, et les<br/>
listes pour les données qui<br/>
évoluent au cours du<br/>
programme. Cette distinction<br/>
améliore la lisibilité du<br/>
code.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire associant des clés à des valeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le dictionnaire associe<br/>
des clés à des valeurs.<br/>
Pour de simples<br/>
constantes, c'est plus<br/>
lourd qu'un tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un tuple, immuable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tuple signale<br/>
l'immuabilité et reste un peu plus<br/>
léger qu'une liste. Par exemple,<br/>
JOURS = ("lun", "mar",<br/>
"mer", ...). Le lecteur<br/>
du code comprend<br/>
immédiatement que ces<br/>
données ne changeront<br/>
pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste, que l'on pourra compléter si les constantes évoluent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste fonctionnerait, mais<br/>
son caractère modifiable contredit<br/>
l'intention (des données figées) et<br/>
n'avertit pas le lecteur du code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une chaîne de caractères, les valeurs séparées par des virgules</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une chaîne n'est pas<br/>
adaptée pour stocker des<br/>
éléments séparés, sauf<br/>
dans des cas<br/>
particuliers.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes<br/>
sur les tuples et les listes,<br/>
laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mémo utile : les clés d'un<br/>
dictionnaire doivent être<br/>
stables dans le temps. Tout<br/>
ce qui est mutable n'offre<br/>
pas cette stabilité, et ne<br/>
peut donc pas servir de<br/>
clé.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux structures supportent l'indexation et le découpage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte : on peut écrire<br/>
l[0], l[1:3] aussi<br/>
bien sur une liste que<br/>
sur un tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les listes peuvent être utilisées comme clés de dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
fausse (donc c'est la<br/>
bonne réponse). Les<br/>
listes sont mutables,<br/>
donc non hashables, et<br/>
ne peuvent pas servir<br/>
de clé. Seuls les<br/>
tuples (à condition que<br/>
tous leurs éléments<br/>
soient hashables)<br/>
peuvent l'être.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>liste = [] crée une liste vide ; t = () crée un tuple vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste est mutable, un tuple est immuable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. C'est même la<br/>
différence la plus<br/>
fondamentale entre les<br/>
deux structures.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q26 : Renverser une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose d'une liste t = [10, 20, 30, 40, 50] et<br/>
l'on veut construire une nouvelle liste r contenant<br/>
les mêmes éléments dans l'ordre inverse, soit<br/>
[50, 40, 30, 20, 10]. Quel code convient ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Construire la liste renversée revient à insérer<br/>
chaque élément en tête, ou à lire la liste de la fin<br/>
vers le début avec les indices len(t) - 1 - i.<br/>
Dans les deux cas, t n'est pas modifiée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for x in t:<br/>
    r.append(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chaque élément est ajouté à la fin de<br/>
r dans l'ordre de parcours. On obtient une<br/>
simple copie [10, 20, 30, 40, 50].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for x in t:<br/>
    r = [x] + r<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque tour, [x] + r place<br/>
le nouvel élément <strong>devant</strong> ceux déjà rangés.<br/>
r vaut successivement [10], [20, 10],<br/>
[30, 20, 10], jusqu'à [50, 40, 30, 20, 10].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for i in range(len(t)):<br/>
    r.append(t[-i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au premier tour, i vaut 0 et t[-0]<br/>
est t[0], le premier élément. Le résultat est<br/>
[10, 50, 40, 30, 20], décalé d'un cran.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for i in range(len(t)):<br/>
    r.append(t[len(t) - i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au premier tour, t[len(t) - 0] vaut<br/>
t[5], hors de la liste, d'où une IndexError.<br/>
Il faudrait écrire t[len(t) - 1 - i].</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q27 : Compter et trouver dans une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Soit t = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]. Que<br/>
renvoient successivement les expressions<br/>
t.count(5) et t.index(5) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthodes utiles sur les listes : count(x) (nombre<br/>
d'occurrences), index(x) (premier indice de x,<br/>
lève ValueError si absent), remove(x) (supprime<br/>
la première occurrence). Pour vérifier la présence<br/>
sans déclencher d'erreur, préférer if x in t:.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5 puis 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion entre les rôles. La méthode<br/>
count répond à « combien ? » (ici trois fois)<br/>
et index à « où ? » (ici à l'indice 4).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3 puis 4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : t.count(5) compte le nombre<br/>
d'occurrences de 5 dans la liste, il y en a<br/>
trois (indices 4, 8 et 10).<br/>
t.index(5) renvoie l'indice de la <strong>première</strong><br/>
occurrence, ici 4 (l'indexation commence à<br/>
zéro).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5 puis 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la valeur 5 est mentionnée trois<br/>
fois et son premier indice n'est pas 5. Bien<br/>
distinguer count (combien d'occurrences) de<br/>
index (à quelle position).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3 puis 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : count est correct (3 occurrences),<br/>
mais index renvoie l'indice du <strong>premier</strong><br/>
5, pas la valeur 5. La première occurrence<br/>
se trouve en position 4.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q28 : append, extend et concaténation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On exécute :</p>
<p>`<code>python<br/>
a = [1, 2, 3]<br/>
b = [4, 5]<br/>
a.append(b)<br/>
</code></p>
<p>Que vaut la liste a` après cette exécution ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux opérations à distinguer : a.append(x)<br/>
ajoute x à la fin de a comme un seul élément,<br/>
en modifiant a sur place ; a + b produit une<br/>
<strong>nouvelle</strong> liste formée des éléments de a<br/>
puis de ceux de b, sans modifier ni a ni b.<br/>
Pour obtenir [1, 2, 3, 4, 5] dans a, on écrit<br/>
donc a = a + b. Confondre les deux est l'une des<br/>
erreurs les plus fréquentes en Python.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code lève une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode append accepte n'importe<br/>
quel objet, y compris une liste. Le code<br/>
s'exécute sans erreur, même si le résultat<br/>
peut surprendre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[1, 2, 3, [4, 5]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : append ajoute son paramètre<br/>
tel quel à la fin de la liste, sans déballage.<br/>
Comme b est lui-même une liste, on obtient<br/>
une liste imbriquée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[1, 2, 3, 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le résultat de<br/>
a = a + b, qui enchaîne les éléments de b<br/>
un par un après ceux de a. La méthode<br/>
append, elle, ajoute son paramètre comme un<br/>
<strong>unique élément</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[[1, 2, 3], 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append ajoute en <strong>fin</strong> de liste,<br/>
pas au début. Et c'est b qui est ajouté, pas<br/>
a.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
