<?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 <code>append</code>, longueur avec <code>len</code>, 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 <code>[]</code>), les tuples (avec<br/>
<code>()</code>) et les dictionnaires (avec<br/>
<code>{}</code>). 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 <code>liste = []</code></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/>
<code>liste = list()</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe <code>liste = ()</code></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 <code>liste = {}</code></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 <code>liste = null</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot-clé <code>null</code> n'existe pas<br/>
en Python ; l'équivalent<br/>
s'appelle <code>None</code>, 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 : <code>(1)</code> est<br/>
simplement l'entier $1$ entouré<br/>
de parenthèses de groupement,<br/>
tandis que <code>(1,)</code> 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 <code>t = tuple[1, 2, 3]</code>, crochets après le mot <code>tuple</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>tuple[...]</code> avec des crochets<br/>
est une annotation de type, pas une<br/>
création de tuple. Pour convertir une<br/>
liste, on écrit <code>tuple([1, 2, 3])</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec <code>t = (1, 2, 3)</code>, ou même <code>t = 1, 2, 3</code></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 <code>()</code> et, pour un<br/>
seul élément, la virgule est<br/>
obligatoire : <code>t = (1,)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>t = {1, 2, 3}</code>, 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 <code>t = [1, 2, 3]</code>, puis <code>t.freeze()</code> pour le figer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les crochets créent une liste,<br/>
et aucune méthode <code>freeze</code> n'existe. La<br/>
conversion se fait avec <code>tuple(liste)</code>.</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 <code>liste.append(x)</code><br/>
modifie la liste sur place. Sur<br/>
un tuple, l'appel<br/>
<code>tuple.append(x)</code> provoque une<br/>
exception <code>AttributeError</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 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 (<code>("a", 1, [2])</code><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/>
<code>["a", "b", "c"][1]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une indexation négative est aussi<br/>
possible : <code>liste[-1]</code> désigne le<br/>
dernier élément, <code>liste[-2]</code><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 <code>"c"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La chaîne <code>"c"</code> 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 <code>"b"</code></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 <code>"a"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>En Python, l'indexation<br/>
commence à $0$. L'élément<br/>
d'indice $0$ est donc <code>"a"</code>,<br/>
et l'élément d'indice $1$ est<br/>
<code>"b"</code>.</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 <code>len</code> s'exécute en<br/>
$O(1)$, car la longueur est<br/>
stockée à part. L'expression<br/>
<code>len([])</code> 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 <code>liste.size()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>size</code> 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 <code>liste.length</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'attribut <code>length</code> 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 <code>len(liste)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction native <code>len</code><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 <code>size(liste)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune fonction <code>size</code><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 <code>liste</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Différence importante : la<br/>
méthode <code>append</code> modifie la<br/>
liste sur place, alors que<br/>
l'opérateur <code>+</code> crée une<br/>
nouvelle liste. Pour ajouter<br/>
plusieurs éléments d'un coup, on<br/>
écrit <code>liste = liste + [4, 5, 6]</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>Avec <code>liste += 42</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'opérateur <code>+=</code> attend un<br/>
itérable, pas un entier.<br/>
L'écriture <code>liste += [42]</code><br/>
fonctionnerait, mais reste<br/>
moins idiomatique<br/>
qu'<code>append</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>liste = liste + 42</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'opérateur <code>+</code> ne sait pas<br/>
combiner une liste avec un<br/>
entier ; il déclenche une<br/>
exception <code>TypeError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec <code>liste.append(42)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette méthode modifie la<br/>
liste sur place. Par<br/>
exemple, après<br/>
<code>liste = [1, 2]; liste.append(3)</code>,<br/>
la liste vaut <code>[1, 2, 3]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>liste.add(42)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>add</code> 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/>
<code>for i in range(len(liste)):</code>.<br/>
On dispose alors à la fois de<br/>
l'indice <code>i</code> et de la valeur<br/>
<code>liste[i]</code> à 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[<pre><code>for i in liste.length:
    print(liste[i])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'attribut <code>length</code> n'existe<br/>
pas en Python, et<br/>
<code>for i in nombre:</code> n'est pas<br/>
une syntaxe valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>print liste</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe correspond à<br/>
Python 2. En Python 3,<br/>
<code>print</code> est une fonction et<br/>
requiert des parenthèses.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>for x in liste:
    print(x)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est la forme idiomatique<br/>
en Python. La variable <code>x</code><br/>
reçoit successivement chacun<br/>
des éléments de la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>while liste:
    print(liste)</code></pre>]]></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/>
<code>liste</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux méthodes utiles existent<br/>
par ailleurs : <code>liste.index(42)</code><br/>
renvoie l'indice de la première<br/>
occurrence, ou lève une<br/>
exception <code>ValueError</code> si<br/>
l'élément n'est pas présent ;<br/>
<code>liste.count(42)</code> 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 <code>liste.has(42)</code></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 <code>42 in liste</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'opérateur <code>in</code> 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 <code>liste.find(42)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>find</code> 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 <code>liste.contains(42)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>contains</code><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 <code>(x, y)</code>,<br/>
retours multiples d'une fonction<br/>
avec <code>return a, b</code>, ou<br/>
enregistrement comme<br/>
<code>("Alice", 17, "Lyon")</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>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/>
<pre><code>l = [1, 2, 3]
l.append(4)
print(len(l))</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La méthode <code>append</code> modifie la<br/>
liste sur place. Il ne faut pas<br/>
écrire <code>l = l.append(4)</code> :<br/>
<code>append</code> ne renvoie rien (la<br/>
valeur renvoyée est <code>None</code>),<br/>
donc <code>l</code> se retrouverait à<br/>
<code>None</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>Il affiche <code>5</code></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 <code>3</code></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 <code>append</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche <code>4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La liste initiale est<br/>
<code>[1, 2, 3]</code>. Après<br/>
<code>l.append(4)</code>, elle vaut<br/>
<code>[1, 2, 3, 4]</code>, 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/>
<code>[1, 2, 3, 4, 5][1:4]</code> ?</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 <code>range(a, b)</code>. Une borne<br/>
omise vaut le début ou la fin :<br/>
<code>[1, 2, 3, 4, 5][:2]</code> donne<br/>
<code>[1, 2]</code> et <code>[1, 2, 3, 4, 5][2:]</code><br/>
donne <code>[3, 4, 5]</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>La liste <code>[1, 2, 3]</code></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 <code>[2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La syntaxe <code>liste[a:b]</code><br/>
extrait les éléments de<br/>
l'indice <code>a</code> (inclus) à<br/>
l'indice <code>b</code> (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 <code>[1, 4]</code></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 <code>[2, 3, 4, 5]</code></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 <code>a</code>,<br/>
<code>b</code> et <code>c</code> après l'instruction<br/>
<code>(a, b, c) = (1, 2, 3)</code> ?</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/>
<code>a, *reste = [1, 2, 3, 4]</code><br/>
affecte $a = 1$ et<br/>
<code>reste = [2, 3, 4]</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>Le tuple <code>((1, 2, 3),)</code></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/>
<code>a, b, c = 1, 2, 3</code>. Cette<br/>
écriture est très utile,<br/>
notamment pour échanger<br/>
deux variables :<br/>
<code>a, b = b, a</code>.</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 <code>l = [10, 20, 30]</code>. Quelle expression<br/>
fournit une <strong>nouvelle</strong> liste contenant tous les<br/>
éléments de <code>l</code> sauf le dernier, quelle que soit la<br/>
longueur de <code>l</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans une tranche <code>l[debut:fin]</code>, la borne de fin est<br/>
exclue et peut être négative : <code>l[:-1]</code> 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><code>l[1:]</code></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 <code>[20, 30]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>l[:-1]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la borne haute <code>-1</code> désigne le<br/>
dernier élément, exclu de la tranche. On obtient<br/>
<code>[10, 20]</code> dans une nouvelle liste ; <code>l</code> n'est<br/>
pas modifiée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>l[:-2]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne haute étant exclue, <code>-2</code><br/>
retire les <strong>deux</strong> derniers éléments. Sur<br/>
l'exemple, la tranche vaut <code>[10]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>l[-1]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans deux-points, les crochets font un<br/>
accès par indice, pas une tranche. <code>l[-1]</code> 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><pre><code>def f(l=[]):
    l.append(1)
    return l

print(f())
print(f())</code></pre><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[<pre><code>[1]
[1]</code></pre>]]></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[<pre><code>[]
[]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette réponse ignore les<br/>
appels à <code>append</code>, qui<br/>
ajoutent bien un élément<br/>
à chaque appel de <code>f</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>[1]
[1, 1]</code></pre>]]></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 <code>l=None</code>,<br/>
puis dans la fonction<br/>
<code>if l is None: l = []</code>.</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/>
<code>liste.sort()</code> et <code>sorted(liste)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Moyen mnémotechnique : <code>sorted</code><br/>
(« trié ») désigne un résultat,<br/>
une nouvelle liste triée<br/>
renvoyée sans modifier<br/>
l'original ; <code>sort</code> (« trier »)<br/>
désigne une action, qui modifie<br/>
la liste sur place et renvoie<br/>
<code>None</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>La méthode <code>sort</code> 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, <code>sorted(liste)</code> appelle <code>liste.sort()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>sorted</code> construit une<br/>
<strong>nouvelle</strong> liste triée sans toucher à<br/>
l'original ; <code>sort</code> modifie la liste sur<br/>
place et renvoie <code>None</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction <code>sorted</code> ne fonctionne que sur des nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction <code>sorted</code><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><code>sort</code> modifie la liste, <code>sorted</code> renvoie une copie triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>sort</code> trie sur place<br/>
et renvoie <code>None</code>, <code>sorted</code> renvoie une<br/>
nouvelle liste. Le choix dépend du besoin :<br/>
si l'on veut conserver<br/>
l'original, on utilise<br/>
<code>sorted</code> ; sinon, <code>sort</code><br/>
est préférable. La<br/>
fonction <code>sorted</code><br/>
fonctionne aussi sur les<br/>
tuples, contrairement à<br/>
<code>sort</code>.</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/>
<code>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]</code><br/>
des carrés des entiers de $1$ à $10$ ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une compréhension de liste<br/>
<code>[expression for i in range(a, b)]</code> construit<br/>
la liste des valeurs de l'expression pour <code>i</code><br/>
allant de <code>a</code> à <code>b - 1</code>. Elle équivaut à une<br/>
boucle qui part d'une liste vide et ajoute<br/>
chaque valeur avec <code>append</code>. Les deux erreurs<br/>
classiques sont de confondre <code><em></code> et <code></em>*</code>, et<br/>
de se tromper sur les bornes de <code>range</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="100" format="html">
    <text><![CDATA[<p><code>[i ** 2 for i in range(1, 11)]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>range(1, 11)</code> parcourt les<br/>
entiers de $1$ à $10$ inclus, et <code>i ** 2</code><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><code>[i * 2 for i in range(1, 11)]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>i <em> 2</code> est le double de <code>i</code>, pas<br/>
son carré. Cette expression construit<br/>
<code>[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]</code>.<br/>
Le carré s'écrit <code>i </em><em> 2</code> ou <code>i </em> i</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[i ** 2 for i in range(10)]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>range(10)</code> commence à $0$ et<br/>
s'arrête à $9$. Cette expression construit<br/>
<code>[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</code> :<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><code>[i ** 2 for i in range(1, 10)]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne de fin de <code>range</code> est<br/>
exclue, donc <code>range(1, 10)</code> s'arrête à<br/>
$9$. Cette expression construit<br/>
<code>[1, 4, 9, 16, 25, 36, 49, 64, 81]</code>, 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><pre><code>a = [1, 2, 3]
b = a
b.append(4)
print(a)</code></pre><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ù <code>b = a</code> 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 <code>[4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>append</code><br/>
ajoute à la liste<br/>
existante, sans la<br/>
remplacer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[1, 2, 3]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'affectation <code>b = a</code> 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 <code>[1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les variables <code>a</code> et <code>b</code><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/>
<code>b = a.copy()</code> ou<br/>
<code>b = a[:]</code>.</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><pre><code>l = [1, 2, 3]
for x in l:
    x = x * 2
print(l)</code></pre><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/>
<code>for i in range(len(l)): l[i] = l[i] * 2</code>. La<br/>
variable <code>x</code> d'un <code>for x in l</code> 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 <code>[2, 4, 6]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>x = x <em> 2</code> crée un nouvel entier et le<br/>
range dans <code>x</code>, sans rien écrire dans la liste.<br/>
Pour doubler les éléments, il faut écrire<br/>
<code>l[i] = l[i] </em> 2</code> en parcourant les indices.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche <code>[1, 2, 3]</code></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, <code>x</code><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 <code>[1, 2, 3, 2, 4, 6]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune instruction n'ajoute d'élément<br/>
à <code>l</code>. Seule la méthode <code>append</code> allongerait la<br/>
liste ; ici on ne fait que réaffecter <code>x</code>.</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 <code>len((42))</code> ?</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/>
<code>type((42))</code> renvoie <code>int</code>,<br/>
tandis que <code>type((42,))</code><br/>
renvoie <code>tuple</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>La valeur $0$, car le tuple <code>(42)</code> est considéré comme vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>(42)</code> n'est pas un tuple du<br/>
tout, et <code>len</code> lève une exception sur un<br/>
entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une exception <code>TypeError</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>(42)</code> n'est pas un tuple<br/>
mais l'entier 42 entre parenthèses, et<br/>
<code>len</code> n'agit pas sur un entier. Pour créer<br/>
un tuple à un seul élément, il faut une<br/>
virgule : <code>(42,)</code>.</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 : <code>len</code> ne renvoie pas la valeur<br/>
de son argument, et <code>(42)</code> 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 <code>(42)</code> 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><pre><code>l = [1, 2, 3]
m = l
l = l + [4]
print(m)</code></pre><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 : <code>l.append(4)</code> et <code>l += [4]</code><br/>
modifient la liste partagée, visible depuis <code>m</code> ;<br/>
<code>l = l + [4]</code> réaffecte <code>l</code> à une nouvelle liste<br/>
et rompt le lien avec <code>m</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>Il affiche <code>[1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'alias <code>m</code> suivrait <code>l</code> si la liste<br/>
était modifiée sur place, par <code>l.append(4)</code> ou<br/>
<code>l += [4]</code>. Mais <code>l + [4]</code> construit une<br/>
<strong>nouvelle</strong> liste, que <code>l</code> reçoit ; <code>m</code> désigne<br/>
toujours l'ancienne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[1, 2, 3, [4]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'opérateur <code>+</code> concatène les éléments<br/>
sans imbriquer la liste <code>[4]</code>, et surtout il<br/>
produit une nouvelle liste : <code>m</code> n'en voit rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche <code>[1, 2, 3]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : après <code>m = l</code>, les deux noms<br/>
désignent la même liste. Puis <code>l + [4]</code> crée<br/>
une nouvelle liste <code>[1, 2, 3, 4]</code>, affectée à<br/>
<code>l</code> seul. <code>m</code> 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 : <code>+</code> entre deux listes est défini et<br/>
produit leur concaténation. Seule l'addition<br/>
d'une liste et d'un entier, comme <code>l + 4</code>,<br/>
lève <code>TypeError</code>.</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><pre><code>grille = [[0] * 3] * 3
grille[0][0] = 1
print(grille)</code></pre><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><code>[[1, 0, 0], [1, 0, 0], [1, 0, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'expression <code>[[0]<em>3]</em>3</code><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/>
<code>[[0] * 3 for _ in range(3)]</code>.</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><code>[[1, 0, 0], [0, 0, 0], [0, 0, 0]]</code></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><code>[[0, 0, 0], [0, 0, 0], [0, 0, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On a affecté<br/>
<code>grille[0][0] = 1</code>, 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/>
<code>eleves = [("Ana", 12), ("Bilal", 9), ("Chloé", 15)]</code>,<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/>
<code>eleves[1] = ("Bilal", 11)</code>. 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><code>eleves[1][1] = 11</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>eleves[1]</code> est le p-uplet<br/>
<code>("Bilal", 9)</code>, et un p-uplet est immuable.<br/>
Python lève<br/>
<code>TypeError: 'tuple' object does not support item assignment</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>eleves[1] = ("Bilal", 11)</code></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/>
<code>[("Ana", 12), ("Bilal", 11), ("Chloé", 15)]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>eleves["Bilal"] = 11</code></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/>
<code>TypeError: list indices must be integers or slices, not str</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>eleves[1].append(11)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>eleves[1]</code> est un p-uplet, qui n'a<br/>
pas de méthode <code>append</code>. Python lève<br/>
<code>AttributeError: 'tuple' object has no attribute 'append'</code>.<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/>
<code>JOURS = ("lun", "mar",<br/>
"mer", ...)</code>. 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/>
<code>l[0]</code>, <code>l[1:3]</code> 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><code>liste = []</code> crée une liste vide ; <code>t = ()</code> 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 <code>t = [10, 20, 30, 40, 50]</code> et<br/>
l'on veut construire une nouvelle liste <code>r</code> contenant<br/>
les mêmes éléments dans l'ordre inverse, soit<br/>
<code>[50, 40, 30, 20, 10]</code>. 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 <code>len(t) - 1 - i</code>.<br/>
Dans les deux cas, <code>t</code> 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[<pre><code>r = []
for x in t:
    r.append(x)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chaque élément est ajouté à la fin de<br/>
<code>r</code> dans l'ordre de parcours. On obtient une<br/>
simple copie <code>[10, 20, 30, 40, 50]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>r = []
for x in t:
    r = [x] + r</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque tour, <code>[x] + r</code> place<br/>
le nouvel élément <strong>devant</strong> ceux déjà rangés.<br/>
<code>r</code> vaut successivement <code>[10]</code>, <code>[20, 10]</code>,<br/>
<code>[30, 20, 10]</code>, jusqu'à <code>[50, 40, 30, 20, 10]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>r = []
for i in range(len(t)):
    r.append(t[-i])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au premier tour, <code>i</code> vaut $0$ et <code>t[-0]</code><br/>
est <code>t[0]</code>, le premier élément. Le résultat est<br/>
<code>[10, 50, 40, 30, 20]</code>, décalé d'un cran.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>r = []
for i in range(len(t)):
    r.append(t[len(t) - i])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au premier tour, <code>t[len(t) - 0]</code> vaut<br/>
<code>t[5]</code>, hors de la liste, d'où une <code>IndexError</code>.<br/>
Il faudrait écrire <code>t[len(t) - 1 - i]</code>.</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 <code>t = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]</code>. Que<br/>
renvoient successivement les expressions<br/>
<code>t.count(5)</code> et <code>t.index(5)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthodes utiles sur les listes : <code>count(x)</code> (nombre<br/>
d'occurrences), <code>index(x)</code> (premier indice de <code>x</code>,<br/>
lève <code>ValueError</code> si absent), <code>remove(x)</code> (supprime<br/>
la première occurrence). Pour vérifier la présence<br/>
sans déclencher d'erreur, préférer <code>if x in t:</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><code>5</code> puis <code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion entre les rôles. La méthode<br/>
<code>count</code> répond à « combien ? » (ici trois fois)<br/>
et <code>index</code> à « où ? » (ici à l'indice $4$).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>3</code> puis <code>4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>t.count(5)</code> compte le nombre<br/>
d'occurrences de $5$ dans la liste, il y en a<br/>
trois (indices $4$, $8$ et $10$).<br/>
<code>t.index(5)</code> 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><code>5</code> puis <code>5</code></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 <code>count</code> (combien d'occurrences) de<br/>
<code>index</code> (à quelle position).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3</code> puis <code>5</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>count</code> est correct ($3$ occurrences),<br/>
mais <code>index</code> 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>
<pre><code>a = [1, 2, 3]
b = [4, 5]
a.append(b)</code></pre>
<p>Que vaut la liste <code>a</code> après cette exécution ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux opérations à distinguer : <code>a.append(x)</code><br/>
ajoute <code>x</code> à la fin de <code>a</code> comme un seul élément,<br/>
en modifiant <code>a</code> sur place ; <code>a + b</code> produit une<br/>
<strong>nouvelle</strong> liste formée des éléments de <code>a</code><br/>
puis de ceux de <code>b</code>, sans modifier ni <code>a</code> ni <code>b</code>.<br/>
Pour obtenir <code>[1, 2, 3, 4, 5]</code> dans <code>a</code>, on écrit<br/>
donc <code>a = a + b</code>. 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 <code>append</code> 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><code>[1, 2, 3, [4, 5]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>append</code> ajoute son paramètre<br/>
tel quel à la fin de la liste, sans déballage.<br/>
Comme <code>b</code> 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><code>[1, 2, 3, 4, 5]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le résultat de<br/>
<code>a = a + b</code>, qui enchaîne les éléments de <code>b</code><br/>
un par un après ceux de <code>a</code>. La méthode<br/>
<code>append</code>, 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><code>[[1, 2, 3], 4, 5]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>append</code> ajoute en <strong>fin</strong> de liste,<br/>
pas au début. Et c'est <code>b</code> qui est ajouté, pas<br/>
<code>a</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
