<?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>,<br/>
appartenance avec <code>in</code>, compréhensions, conversions<br/>
d'un type à l'autre, affectation multiple et<br/>
déballage, le choix de la structure selon<br/>
l'usage, et les tranches (slicing) : bornes,<br/>
indices négatifs, pas et copie.</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>Les indices d'une liste de $n$<br/>
éléments vont de $0$ à $n - 1$ :<br/>
le premier élément a l'indice $0$<br/>
et le dernier l'indice<br/>
<code>len(liste) - 1</code>. Un indice<br/>
supérieur ou égal à $n$ lève une<br/>
exception <code>IndexError</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 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>On peut aussi écrire ce test soi-même : une boucle <code>for</code> parcourt<br/>
la liste et compare chaque élément à $42$. Le coût est linéaire<br/>
dans les deux cas.</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 booléen indiquant la présence ou<br/>
l'absence de l'élément. Sur une liste, Python parcourt les éléments<br/>
un par un jusqu'à trouver $42$.</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/>
3 : 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 : Extraire des éléments consécutifs</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>t = [10, 20, 30, 40, 50]</code>. Que vaut<br/>
l'expression <code>[t[i] for i in range(1, 4)]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans <code>range(a, b)</code>, la borne <code>a</code><br/>
est incluse et la borne <code>b</code><br/>
exclue. La compréhension<br/>
<code>[t[i] for i in range(a, b)]</code><br/>
construit donc la liste des<br/>
éléments d'indices <code>a</code> à <code>b - 1</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>[10, 20, 30]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les indices commencent à $0$ :<br/>
<code>t[1]</code> désigne le deuxième<br/>
élément, $20$, et non celui qui<br/>
le précède.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste <code>[20, 30, 40]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>range(1, 4)</code> produit les indices<br/>
$1$, $2$ et $3$, la borne $4$ étant<br/>
exclue. La compréhension prend<br/>
les éléments situés à ces<br/>
indices : $20$, $30$ et $40$.</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>Ce sont les indices produits<br/>
par <code>range(1, 4)</code>. La<br/>
compréhension ne garde pas <code>i</code><br/>
mais <code>t[i]</code>, l'élément situé à<br/>
cet indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[20, 30, 40, 50]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La borne haute de <code>range</code> est<br/>
<strong>exclue</strong> : l'indice $4$, qui<br/>
désigne $50$, n'est pas<br/>
produit.</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>L'affectation multiple sert aussi à récupérer d'un coup les valeurs<br/>
d'un p-uplet renvoyé par une fonction : si <code>f()</code> renvoie <code>(4, 7)</code>,<br/>
l'instruction <code>x, y = f()</code> affecte $x = 4$ et $y = 7$.</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 la compréhension <code>[l[i] for i in range(n)]</code>,<br/>
les indices vont de $0$ à <code>n - 1</code>. En prenant<br/>
<code>len(l) - 1</code> comme borne, on s'arrête juste avant<br/>
le dernier élément. Le résultat est une nouvelle<br/>
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[i] for i in range(1, len(l))]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les indices vont de $1$ à<br/>
<code>len(l) - 1</code>, ce qui retire le <strong>premier</strong><br/>
élément. Sur l'exemple, on obtient<br/>
<code>[20, 30]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>[l[i] for i in range(len(l) - 1)]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>range(len(l) - 1)</code> produit<br/>
les indices de $0$ à <code>len(l) - 2</code>, soit tous<br/>
sauf celui du dernier élément. 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[i] for i in range(len(l) - 2)]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne <code>len(l) - 2</code> étant exclue,<br/>
les indices s'arrêtent à <code>len(l) - 3</code> et les<br/>
<strong>deux</strong> derniers éléments disparaissent. Sur<br/>
l'exemple, on obtient <code>[10]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>l[len(l) - 1]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans compréhension, les crochets font<br/>
un accès par indice. <code>l[len(l) - 1]</code> est le<br/>
dernier élément lui-même, ici $30$, et non une<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q14 : Une fonction qui renvoie deux notes à la fois</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>def bornes(notes):
    mini = notes[0]
    maxi = notes[0]
    for n in notes:
        if n &lt; mini:
            mini = n
        if n &gt; maxi:
            maxi = n
    return (mini, maxi)
resultat = bornes([12, 8, 15, 10])</code></pre><br/>
Que contient la variable <code>resultat</code> après l'exécution de ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une fonction renvoie une seule valeur, mais cette valeur peut être<br/>
un p-uplet : c'est ainsi qu'on renvoie plusieurs résultats à la<br/>
fois. On les récupère ensuite par <code>resultat[0]</code> et <code>resultat[1]</code>,<br/>
ou directement avec <code>bas, haut = bornes([12, 8, 15, 10])</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>Le tuple <code>(8, 15)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle retient la plus petite note, $8$, et la<br/>
plus grande, $15$. L'instruction <code>return (mini, maxi)</code> renvoie un<br/>
p-uplet de deux valeurs, qui est affecté à <code>resultat</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[8, 15]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les parenthèses de <code>return (mini, maxi)</code> construisent un<br/>
tuple, pas une liste. Les valeurs sont justes, mais le type ne<br/>
l'est pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'entier <code>8</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>return</code> ne s'arrête pas à la première valeur. Il renvoie<br/>
le p-uplet entier <code>(mini, maxi)</code>, qui contient les deux notes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tuple <code>(15, 8)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre des valeurs est celui écrit dans<br/>
<code>return (mini, maxi)</code> : d'abord le minimum, puis le maximum.</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 construit une<br/>
nouvelle liste, par exemple<br/>
<code>b = [x for x in 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>Les types immuables classiques peuvent servir de clés : entiers,<br/>
flottants, chaînes et tuples, à condition que ces derniers ne<br/>
contiennent eux-mêmes que des valeurs immuables. Les listes et les<br/>
dictionnaires, modifiables, ne le peuvent pas.</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 a une raison technique : une clé doit rester<br/>
identique pour que le dictionnaire retrouve la valeur associée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce qu'un tuple est immuable, contrairement à une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les clés de dictionnaire doivent rester identiques dans le temps.<br/>
Une liste, modifiable, ne peut pas servir de clé : on pourrait la<br/>
changer après l'avoir utilisée, et le dictionnaire ne retrouverait<br/>
plus la valeur associée.</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 — 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 la fonction <code>len</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est correcte : on peut écrire <code>s[0]</code> ou <code>len(s)</code><br/>
aussi bien sur une liste que 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 fausse (donc c'est la bonne réponse). Les<br/>
listes sont modifiables, donc interdites comme clés de<br/>
dictionnaire. Les tuples peuvent l'être, à condition que tous leurs<br/>
éléments soient eux-mêmes immuables.</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) - 1):
    r.append(t[len(t) - 1 - i])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice <code>len(t) - 1 - i</code> lit bien la<br/>
liste depuis la fin, mais <code>range(len(t) - 1)</code> ne<br/>
fait que $4$ tours. Le résultat<br/>
<code>[50, 40, 30, 20]</code> oublie le premier élément, $10$.</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 les 5 et repérer le premier</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>t = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
compteur = 0
premier = -1
for i in range(len(t)):
    if t[i] == 5:
        compteur = compteur + 1
        if premier == -1:
            premier = i
print(compteur, premier)</code></pre><br/>
Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un seul parcours suffit pour compter les occurrences et retenir la<br/>
position de la première. La valeur de départ $-1$, qui n'est jamais<br/>
un indice produit par <code>range</code>, signale que la valeur n'a pas encore<br/>
été rencontré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>3 10</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait l'indice de la <strong>dernière</strong> occurrence. Le test<br/>
<code>premier == -1</code> n'est vrai qu'au premier $5$ rencontré ; ensuite<br/>
<code>premier</code> vaut $4$ et n'est plus modifié.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>3 4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la valeur $5$ apparaît trois fois, aux indices $4$, $8$ et $10$. La variable <code>premier</code> ne reçoit un indice que tant<br/>
qu'elle vaut $-1$, donc seulement à la première occurrence : $4$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3 5</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les indices commencent à $0$. Le premier $5$ est le<br/>
cinquième élément de la liste, mais son indice est $4$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>4 3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les rôles sont inversés. <code>compteur</code> vaut le nombre<br/>
d'occurrences, $3$, et <code>premier</code> l'indice de la première, $4$ ;<br/>
<code>print</code> les affiche dans cet ordre.</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>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q29 : Un tuple de types différents</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le tuple <code>eleve = ("Ana", 15, True)</code><br/>
est-il valide en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un tuple sert justement à réunir des<br/>
informations de natures différentes sur<br/>
un même objet : <code>("Ana", 15, True)</code> se<br/>
lit comme une fiche à trois champs.</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>Oui : un tuple regroupe des valeurs de types différents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un tuple, comme une<br/>
liste, accepte des éléments de types<br/>
différents. C'est même son emploi le<br/>
plus courant : regrouper les<br/>
caractéristiques d'une même chose,<br/>
ici un prénom, une note et un<br/>
booléen.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non : tous les éléments d'un tuple doivent avoir le même type</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette contrainte n'existe ni<br/>
pour les tuples ni pour les listes.<br/>
Elle existe dans d'autres langages,<br/>
comme les tableaux du langage C.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non : un tuple n'accepte que des nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tuple accepte n'importe<br/>
quel type de valeur, y compris des<br/>
chaînes, des booléens, et même<br/>
d'autres tuples.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement si on l'écrit sans parenthèses</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les parenthèses ne changent<br/>
rien aux types acceptés. Ce sont les<br/>
virgules qui créent le tuple.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q30 : D'une liste au tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment obtient-on un <strong>tuple</strong> à partir<br/>
de la liste <code>l = [1, 2, 3]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les deux conversions se font par les<br/>
fonctions qui portent le nom du type :<br/>
<code>tuple(l)</code> dans un sens, <code>list(t)</code> dans<br/>
l'autre. Chacune crée une nouvelle<br/>
structure, l'originale 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="100" format="html">
    <text><![CDATA[<p>Avec <code>t = tuple(l)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>tuple(l)</code> construit un<br/>
nouveau tuple avec les mêmes éléments.<br/>
La conversion inverse s'écrit<br/>
<code>list(t)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>t = l.tuple()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les listes n'ont pas de<br/>
méthode <code>tuple</code>. La conversion se fait<br/>
par la fonction <code>tuple</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>t = (l)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : des parenthèses autour d'une<br/>
liste ne changent rien, <code>t</code> reste la<br/>
même liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>t = l.freeze()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette méthode n'existe pas en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q31 : Échanger deux variables</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>a = 1
b = 2
a, b = b, a
print(a, b)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette ligne cache un tuple : Python<br/>
évalue <code>b, a</code>, ce qui donne <code>(2, 1)</code>,<br/>
puis déballe ce tuple dans <code>a, b</code>. D'où<br/>
l'échange en une seule instruction.</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>Il affiche <code>2 1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la partie droite<br/>
construit d'abord le tuple <code>(2, 1)</code>,<br/>
puis ses deux valeurs sont rangées<br/>
dans <code>a</code> et <code>b</code>. L'échange se fait<br/>
sans variable intermédiaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>1 2</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les valeurs sont bien<br/>
échangées. Ce serait le résultat sans<br/>
la troisième ligne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>2 2</code>, car <code>a</code> est écrasé avant d'être lu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est ce qui arriverait avec<br/>
deux affectations successives<br/>
(<code>a = b</code> puis <code>b = a</code>). Ici la partie<br/>
droite est entièrement évaluée avant<br/>
toute affectation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une erreur de syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette écriture est correcte<br/>
en Python, c'est même la façon<br/>
habituelle d'échanger deux variables.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q32 : Ce qu'un tuple sait faire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>t = (3, 1, 4, 1, 5)</code>.<br/>
Quelle instruction est <strong>valide</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un tuple ne garde que les méthodes qui<br/>
ne modifient rien : <code>count</code> et <code>index</code>.<br/>
Toutes celles qui transforment la<br/>
structure (<code>append</code>, <code>sort</code>, <code>remove</code>)<br/>
appartiennent aux seules listes.</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>t.count(1)</code>, qui renvoie $2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>count</code> compte les<br/>
occurrences d'une valeur et <code>index</code><br/>
donne la position de la première.<br/>
Ces deux méthodes ne modifient rien,<br/>
elles sont donc permises sur un<br/>
tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>t.append(9)</code>, qui ajoute $9$ à la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>append</code> modifierait le<br/>
tuple, ce qui est impossible.<br/>
L'exécution lève une exception<br/>
<code>AttributeError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>t.sort()</code>, qui range les valeurs dans l'ordre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>sort</code> trie sur place, donc<br/>
modifie. Sur un tuple, on passe par<br/>
<code>sorted(t)</code>, qui renvoie une nouvelle<br/>
liste triée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>t[0] = 7</code>, qui remplace le premier élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : remplacer un élément revient à<br/>
modifier le tuple, ce qui lève une<br/>
exception <code>TypeError</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q33 : Parcourir un tuple par ses indices</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>t = (10, 20, 30)
for i in range(len(t)):
    print(t[i])</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un tuple se lit exactement comme une<br/>
liste : par indice, par parcours direct<br/>
<code>for v in t</code>, ou avec <code>len</code>. La seule<br/>
différence apparaît quand on veut<br/>
écrire.</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>Il affiche <code>10</code>, <code>20</code> puis <code>30</code>, une valeur par ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la lecture par indice<br/>
fonctionne sur un tuple comme sur une<br/>
liste. Seule l'écriture est interdite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une exception, un tuple n'ayant pas d'indices</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les éléments d'un tuple sont<br/>
numérotés à partir de $0$, exactement<br/>
comme ceux d'une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>0</code>, <code>1</code> puis <code>2</code>, c'est-à-dire les indices</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>t[i]</code> désigne la valeur<br/>
rangée à l'indice <code>i</code>, pas l'indice<br/>
lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>(10, 20, 30)</code> en une seule ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le <code>print</code> est à l'intérieur<br/>
de la boucle, il s'exécute une fois<br/>
par tour.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q34 : Ajouter à un tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>t = (1, 2)
u = t + (3,)
print(t, u)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Retenir la nuance : on ne modifie jamais<br/>
un tuple, on en fabrique un autre. Même<br/>
<code>t += (3,)</code> ne fait pas exception, cette<br/>
écriture range un nouveau tuple dans <code>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="100" format="html">
    <text><![CDATA[<p>Il affiche <code>(1, 2) (1, 2, 3)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la concaténation<br/>
construit un <strong>nouveau</strong> tuple <code>u</code>,<br/>
sans toucher à <code>t</code>. C'est la seule<br/>
façon d'« agrandir » un tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>(1, 2, 3) (1, 2, 3)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>t</code> n'est pas modifié, un<br/>
tuple ne peut pas l'être. Seul <code>u</code><br/>
contient la valeur $3$ en plus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une exception, un tuple étant immuable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'immuabilité interdit de<br/>
modifier un tuple existant, pas d'en<br/>
créer un nouveau à partir de lui.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>(1, 2) (1, 2, (3,))</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le <code>+</code> entre deux tuples met<br/>
leurs éléments bout à bout, il<br/>
n'imbrique pas le second dans le<br/>
premier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q35 : Parcourir en déballant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>eleves = [("Ana", 12), ("Bilal", 9)]
for prenom, note in eleves:
    print(prenom, note)</code></pre><br/>
Pourquoi ce parcours fonctionne-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le déballage dans l'en-tête de boucle<br/>
rend le code lisible : <code>prenom</code> et <code>note</code><br/>
disent ce que contiennent les deux<br/>
champs, là où <code>eleve[0]</code> et <code>eleve[1]</code><br/>
obligent à se souvenir de l'ordre.</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>Chaque élément est un tuple déballé dans les deux variables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque tour, le<br/>
tuple courant est déballé, son premier<br/>
élément va dans <code>prenom</code> et le second<br/>
dans <code>note</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Python parcourt d'abord tous les prénoms, puis toutes les notes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle avance élève par<br/>
élève, et non colonne par colonne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est une erreur : il faudrait écrire <code>for eleve in eleves</code> puis <code>eleve[0]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette écriture fonctionne aussi, mais<br/>
elle n'est pas obligatoire. Le<br/>
déballage donne des noms parlants aux<br/>
deux champs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela ne fonctionne que si les deux valeurs sont du même type</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les types n'ont aucune<br/>
importance, seul le nombre de valeurs<br/>
compte.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q36 : Corriger une valeur d'un tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>point = (3, 7)</code> et l'on<br/>
veut obtenir le point d'abscisse $5$ et<br/>
de même ordonnée. Que fait-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quand une valeur doit changer souvent,<br/>
c'est le signe qu'une liste conviendrait<br/>
mieux. Le tuple s'emploie pour ce qui ne<br/>
bouge pas, comme les coordonnées d'un<br/>
point déjà placé.</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>On construit un nouveau tuple : <code>point = (5, point[1])</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on ne modifie pas le<br/>
tuple, on en construit un autre et on<br/>
le range dans la même variable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On écrit <code>point[0] = 5</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette affectation lève une<br/>
exception <code>TypeError</code>, un tuple<br/>
n'accepte aucune modification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On écrit <code>point.modifier(0, 5)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette méthode n'existe pas,<br/>
et modifier un tuple est de toute<br/>
façon impossible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On écrit <code>point.append(5)</code> puis on retire l'ancienne valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>append</code> n'existe pas sur un<br/>
tuple, et ajouter ne remplacerait pas<br/>
l'abscisse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q37 : Un tuple qui contient une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>t = ([1, 2], 3)
t[0].append(9)
print(t)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'immuabilité d'un tuple porte sur ses<br/>
cases, pas sur le contenu des objets<br/>
qu'elles désignent. Un tuple de listes<br/>
reste donc modifiable en profondeur, ce<br/>
qui lui interdit d'être clé de<br/>
dictionnaire.</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>Il affiche <code>([1, 2, 9], 3)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tuple garde les<br/>
mêmes éléments, c'est la liste rangée<br/>
en première position qui change. Rien<br/>
n'interdit cela.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une exception, le tuple étant immuable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne remplace aucun élément<br/>
du tuple, on modifie l'objet qu'il<br/>
désigne. Le tuple lui-même n'est pas<br/>
touché.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>([1, 2], 3)</code>, la modification étant perdue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>append</code> modifie bien la<br/>
liste, et le tuple désigne cette même<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>([1, 2], 3, 9)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le $9$ est ajouté à la liste<br/>
intérieure, pas au tuple.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q38 : Trier des tuples</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut<br/>
<code>sorted([(2, "b"), (1, "z"), (2, "a")])</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette comparaison par ordre lexical,<br/>
comme dans un dictionnaire de langue,<br/>
explique l'astuce courante : ranger la<br/>
clé de tri en tête du tuple pour trier<br/>
des données sans effort.</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, 'z'), (2, 'a'), (2, 'b')]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : deux tuples se<br/>
comparent élément par élément. Les<br/>
premiers éléments décident, et en cas<br/>
d'égalité on départage sur le<br/>
deuxième.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[(1, 'z'), (2, 'b'), (2, 'a')]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à premier élément égal, la<br/>
comparaison se poursuit sur le<br/>
deuxième, donc <code>'a'</code> passe avant<br/>
<code>'b'</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[(2, 'a'), (2, 'b'), (1, 'z')]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri est croissant, le<br/>
tuple commençant par $1$ vient en<br/>
premier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception, car les tuples mêlent nombres et chaînes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la comparaison ne mêle jamais<br/>
les types ici, elle compare des<br/>
nombres entre eux puis, si besoin,<br/>
des chaînes entre elles.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q39 : Un carnet de notes qui s'allonge</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un programme enregistre les notes d'un<br/>
élève au fil de l'année. Quelle structure<br/>
convient ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La bonne question à se poser est<br/>
toujours la même : est-ce que le contenu<br/>
va changer ? Si oui, liste ; si non,<br/>
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="100" format="html">
    <text><![CDATA[<p>Une liste, car le nombre de notes augmente au fil du temps</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une structure qui<br/>
grandit demande une liste, seule à<br/>
accepter <code>append</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple, car les notes ne changent plus une fois attribuées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une note déjà attribuée ne change<br/>
plus, mais le carnet, lui, s'allonge :<br/>
il faudrait reconstruire le tuple à<br/>
chaque note.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple, car il occupe moins de place en mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le gain est réel mais négligeable ici,<br/>
et il ne compense pas l'impossibilité<br/>
d'ajouter une note.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste, mais seulement si les notes sont des entiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste accepte tous les<br/>
types, entiers comme décimaux.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q40 : Un tableau de données</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut représenter un tableau de<br/>
relevés, une ligne par mesure, chaque<br/>
ligne contenant une date et une<br/>
température. Quelle structure ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est la forme habituelle d'un tableau de<br/>
données en Python : une liste de lignes,<br/>
chaque ligne étant un tuple de champs,<br/>
exactement ce que renvoie la lecture d'un<br/>
fichier CSV.</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>Une liste de tuples, la liste pour les lignes, un tuple par mesure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tableau s'allonge à<br/>
chaque relevé, d'où la liste ; une<br/>
mesure, elle, forme un couple figé,<br/>
d'où le tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple de listes, le tuple pour les lignes, une liste par mesure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse. Le tuple<br/>
extérieur empêcherait d'ajouter des<br/>
relevés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste de listes, pour pouvoir modifier n'importe quelle valeur plus tard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cela fonctionne, mais rien ne justifie<br/>
de rendre modifiable une mesure déjà<br/>
relevée. Le tuple dit au lecteur que<br/>
la ligne est figée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple de tuples, pour empêcher toute modification du tableau de relevés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tableau doit accueillir de<br/>
nouveaux relevés, il ne peut donc pas<br/>
être un tuple.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q41 : Tranche d'un tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>t = (10, 20, 30, 40, 50)</code>.<br/>
Que vaut <code>t[1:3]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Découper ne modifie pas : la tranche<br/>
construit une nouvelle structure du même<br/>
type que l'original. <code>t[1:3]</code> se lit « de<br/>
l'indice $1$ jusqu'à l'indice $3$ exclu ».</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>Le tuple <code>(20, 30)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la tranche part de<br/>
l'indice $1$ inclus et s'arrête à<br/>
l'indice $3$ exclu. Le résultat est un<br/>
nouveau tuple, celui d'origine reste<br/>
intact.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[20, 30]</code>, car une tranche renvoie toujours une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une tranche conserve le type<br/>
de départ. Sur un tuple, elle renvoie<br/>
un tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tuple <code>(20, 30, 40)</code>, les deux indices étant inclus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice de fin est exclu, le<br/>
$40$ n'est pas pris.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception, un tuple n'acceptant pas les tranches</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : lire une tranche ne modifie<br/>
rien, c'est donc permis sur un tuple.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q42 : Retirer une valeur d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>l = [3, 1, 4, 1, 5]
l.remove(1)
print(l)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux pièges en un : <code>remove</code> travaille sur<br/>
une valeur et non sur un indice, et il<br/>
n'en retire qu'une seule. Sur un tuple,<br/>
cette méthode n'existe pas, puisqu'elle<br/>
modifierait la structure.</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>Il affiche <code>[3, 4, 1, 5]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>remove</code> retire la<br/>
<strong>première</strong> occurrence de la valeur<br/>
demandée, pas toutes. Le second $1$<br/>
reste en place.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[3, 4, 5]</code>, les deux $1$ ayant disparu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une seule occurrence est<br/>
retirée par appel. Il faudrait appeler<br/>
<code>remove</code> autant de fois qu'il y a de<br/>
valeurs à retirer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[1, 4, 1, 5]</code>, le premier élément étant retiré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>remove</code> prend une <strong>valeur</strong>,<br/>
pas une position. Retirer par indice se<br/>
fait autrement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[3, 1, 4, 1, 5]</code>, <code>remove</code> renvoyant une nouvelle liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>remove</code> modifie la liste sur<br/>
place et ne renvoie rien.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q43 : Indice du dernier élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La liste <code>notes</code> contient $12$ valeurs.<br/>
Quelle expression désigne sa dernière<br/>
valeur ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une liste de $n$ éléments a ses indices de<br/>
$0$ à $n-1$ : c'est la source d'erreur la<br/>
plus fréquente quand on parcourt une liste<br/>
par ses indices.</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>notes[len(notes) - 1]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les indices vont de $0$<br/>
à $11$, le dernier vaut donc<br/>
$12 - 1 = 11$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>notes[len(notes)]</code>, la longueur servant d'indice</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cet indice vaut $12$, il<br/>
dépasse d'une unité et lève une<br/>
exception <code>IndexError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>notes[12]</code>, puisque la liste compte douze valeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : même problème, les indices<br/>
s'arrêtent à $11$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>notes.dernier()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette méthode n'existe pas en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q44 : Construire une liste dans une boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>carres = []
for i in range(1, 5):
    carres.append(i * i)
print(carres)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est le schéma le plus courant en<br/>
programmation : une liste vide, une boucle,<br/>
un <code>append</code> par tour. Le résultat se lit<br/>
dans l'ordre de construction.</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>Il affiche <code>[1, 4, 9, 16]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la liste part vide et<br/>
reçoit un carré à chaque tour, pour <code>i</code><br/>
valant $1$, $2$, $3$ puis $4$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[1, 4, 9, 16, 25]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>range(1, 5)</code> s'arrête à $4$,<br/>
la borne de fin est exclue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[0, 1, 4, 9, 16]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle commence à $1$, pas<br/>
à $0$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>16</code>, seule la dernière valeur étant gardée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>append</code> ajoute sans écraser,<br/>
toutes les valeurs restent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q45 : D'un range à une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut <code>list(range(2, 9, 2))</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>range</code> ne crée pas une liste mais une<br/>
suite d'entiers parcourable ; <code>list</code> la<br/>
déroule. Les trois arguments se lisent<br/>
« début, fin exclue, pas ».</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>[2, 4, 6, 8]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on part de $2$, on<br/>
avance de $2$ en $2$, et on s'arrête<br/>
avant $9$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[2, 4, 6, 8, 10]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : $10$ dépasse la borne de fin,<br/>
qui est exclue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[2, 3, 4, 5, 6, 7, 8]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le troisième argument est le<br/>
pas, ici $2$, et non une simple borne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[0, 2, 4, 6, 8]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le premier argument est le<br/>
début, ici $2$ et non $0$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q46 : Deux façons de parcourir</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>l = [4, 7, 2]
for v in l:
    print(v)
for i in range(len(l)):
    print(l[i])</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Parcourir par élément se lit mieux ;<br/>
parcourir par indice devient nécessaire dès<br/>
qu'on a besoin de la position, par exemple<br/>
pour comparer un élément à son voisin.</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>Il affiche deux fois de suite les valeurs $4$, $7$ et $2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux parcours<br/>
donnent les mêmes valeurs, dans le même<br/>
ordre. Le second connaît en plus la<br/>
position de chaque élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche les valeurs, puis les indices $0$, $1$ et $2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la seconde boucle affiche<br/>
<code>l[i]</code>, c'est-à-dire la valeur rangée à<br/>
l'indice <code>i</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une exception à la seconde boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>range(len(l))</code> produit<br/>
exactement les indices valides.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche les valeurs, puis la liste entière trois fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>l[i]</code> désigne un élément, pas<br/>
la liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q47 : Somme des éléments</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>notes = [12, 15, 9]
total = 0
for n in notes:
    total = total + n
print(total)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'accumulateur initialisé à $0$ avant la<br/>
boucle est le schéma de base d'un calcul<br/>
sur une liste : somme, produit, moyenne,<br/>
comptage en dérivent tous.</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>Il affiche <code>36</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'accumulateur part de<br/>
$0$ et reçoit chaque note, d'où<br/>
$12 + 15 + 9 = 36$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>12</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le résultat si<br/>
<code>total</code> était réaffecté à chaque tour<br/>
au lieu d'être augmenté.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[12, 15, 9]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>total</code> est un nombre, pas une<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>9</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : $9$ est la dernière note, pas<br/>
la somme.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q48 : Chercher le maximum</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>valeurs = [3, 9, 4]
m = valeurs[0]
for v in valeurs:
    if v &gt; m:
        m = v
print(m)</code></pre><br/>
Pourquoi initialise-t-on <code>m</code> avec<br/>
<code>valeurs[0]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Initialiser avec un élément de la liste,<br/>
plutôt qu'avec $0$, est la précaution qui<br/>
rend l'algorithme correct pour des valeurs<br/>
négatives.</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>Pour partir d'une valeur de la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : en partant du premier<br/>
élément, la comparaison a du sens dès le<br/>
premier tour, quelles que soient les<br/>
valeurs, y compris négatives.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le maximum est toujours le premier élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ici le maximum est $9$, qui<br/>
n'est pas en première position.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'une variable doit toujours valoir $0$ au départ</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : initialiser à $0$ donnerait un<br/>
résultat faux si toutes les valeurs<br/>
étaient négatives.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour que la boucle commence à l'indice $1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle parcourt toute la<br/>
liste, le premier élément est<br/>
simplement comparé à lui-même.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q49 : Compréhension avec condition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>notes = [8, 14, 11, 5]</code>.<br/>
Quelle expression construit la liste des<br/>
notes supérieures ou égales à $10$ ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une compréhension se lit dans l'ordre :<br/>
ce qu'on garde, d'où ça vient, à quelle<br/>
condition. Elle remplace une boucle avec<br/>
<code>append</code> en une ligne.</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>[n for n in notes if n &gt;= 10]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la condition filtre les<br/>
éléments gardés, ici <code>[14, 11]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[n if n &gt;= 10 for n in notes]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la condition de filtre se place<br/>
après la boucle, pas avant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[notes if n &gt;= 10]</code>, sans boucle explicite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque la boucle <code>for</code>, qui<br/>
parcourt les éléments un à un.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[n &gt;= 10 for n in notes]</code>, qui teste chaque note</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette expression construit une<br/>
liste de booléens, <code>[False, True, True,<br/>
False]</code>, et non les notes elles-mêmes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q50 : Tableau à deux dimensions</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>grille = [[1, 2, 3], [4, 5, 6]]
print(grille[1][2])</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un tableau de données se range souvent<br/>
ainsi : une liste de lignes, chaque ligne<br/>
étant une liste de valeurs. Le premier<br/>
indice choisit la ligne, le second la<br/>
colonne.</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>Il affiche <code>6</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>grille[1]</code> désigne la<br/>
deuxième ligne <code>[4, 5, 6]</code>, et <code>[2]</code> en<br/>
prend le troisième élément.</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>Erreur : ce serait <code>grille[0][2]</code>, sur<br/>
une autre ligne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[4, 5, 6]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le second indice descend dans<br/>
la ligne, il ne l'affiche pas en<br/>
entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>2</code>, l'élément d'indice $1$ dans la liste aplatie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste de listes n'est pas<br/>
aplatie, les deux indices désignent la<br/>
ligne puis la colonne.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q51 : Travailler sur une copie</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>original = [1, 2, 3]
copie = original[:]
copie.append(4)
print(original, copie)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Retenir la différence : <code>copie = original</code><br/>
partage la même liste, <code>copie = original[:]</code><br/>
en fabrique une nouvelle. C'est la<br/>
précaution à prendre avant toute<br/>
modification.</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>Il affiche <code>[1, 2, 3] [1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la tranche construit une<br/>
nouvelle liste. Modifier la copie laisse<br/>
l'originale intacte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[1, 2, 3, 4] [1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le cas avec<br/>
<code>copie = original</code>, qui donne deux noms<br/>
à la même liste.</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 : la copie contient déjà les<br/>
trois valeurs avant l'ajout.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il déclenche une exception, une liste ne se copiant pas ainsi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>original[:]</code> est une écriture<br/>
courante et valide pour copier une<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q52 : Lignes et colonnes d'un tableau</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<pre><code>t = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]</code></pre>
<p>Combien de lignes et de colonnes possède le tableau<br/>
<code>t</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un tableau à deux dimensions est une liste de<br/>
listes : la liste extérieure contient les lignes,<br/>
chaque ligne contient les colonnes. <code>len(t)</code> donne<br/>
le nombre de lignes, <code>len(t[0])</code> le nombre de<br/>
colonnes.</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>$4$ lignes et $3$ colonnes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>len(t)</code> vaut $4$ (quatre listes intérieures) et<br/>
<code>len(t[0])</code> vaut $3$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$3$ lignes et $4$ colonnes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Chaque liste intérieure est une ligne ; il y en a<br/>
quatre, de trois éléments chacune.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$12$ lignes et $1$ colonne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les douze valeurs sont réparties en quatre listes<br/>
de trois, pas en douze listes d'un élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$4$ lignes et $4$ colonnes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une ligne compte trois éléments : <code>t[0]</code> est<br/>
<code>[0, 1, 2]</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q53 : Modifier une case d'une grille</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<pre><code>grille = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
grille[2][0] = 0
print(grille)</code></pre>
<p>Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>grille[i][j]</code> se lit de gauche à droite :<br/>
<code>grille[i]</code> sélectionne la ligne d'indice <code>i</code>, puis<br/>
<code>[j]</code> la colonne. Les indices commencent à $0$ :<br/>
la ligne $2$ est la troisième, la colonne $0$ la<br/>
première.</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, 2, 3], [4, 5, 6], [0, 8, 9]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>grille[2]</code> est la troisième ligne, <code>[7, 8, 9]</code>,<br/>
et <code>[0]</code> en désigne le premier élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[[0, 2, 3], [4, 5, 6], [7, 8, 9]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce serait <code>grille[0][0] = 0</code> ; le premier indice<br/>
choisit la ligne, pas la colonne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[[1, 2, 0], [4, 5, 6], [7, 8, 9]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les indices sont lus dans l'ordre ligne puis<br/>
colonne : $2$ puis $0$, pas $0$ puis $2$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[[1, 2, 3], [4, 5, 6], [7, 8, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>[0]</code> désigne le premier élément de la ligne, pas<br/>
le dernier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q54 : Somme d'une colonne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<pre><code>t = [[1, 2], [3, 4], [5, 6]]
total = 0
for i in range(len(t)):
    total = total + t[i][1]
print(total)</code></pre>
<p>Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La boucle parcourt les indices de ligne ; à chaque<br/>
tour, elle ajoute l'élément de colonne $1$ de la<br/>
ligne courante. Pour sommer une ligne entière, on<br/>
parcourrait au contraire les indices de colonne à<br/>
ligne fixé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="100" format="html">
    <text><![CDATA[<p><code>12</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>t[i][1]</code> est le deuxième élément de chaque<br/>
ligne : $2 + 4 + 6 = 12$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>9</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>$1 + 3 + 5$ serait la somme de la colonne<br/>
d'indice $0$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>21</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est la somme de toutes les valeurs ; la boucle<br/>
n'ajoute qu'un élément par ligne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>6</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce serait la dernière valeur lue, pas la somme<br/>
accumulée dans <code>total</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q55 : Construire une grille par compréhension</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<pre><code>m = [[0 for j in range(3)] for i in range(2)]</code></pre>
<p>Quelle valeur reçoit <code>m</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une compréhension dans une compréhension : la partie<br/>
intérieure <code>[0 for j in range(3)]</code> construit une<br/>
ligne, la partie extérieure répète cette<br/>
construction pour chaque <code>i</code>. C'est la façon sûre de<br/>
créer une grille vide, chaque ligne étant une liste<br/>
distincte.</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>[[0, 0, 0], [0, 0, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La compréhension extérieure fabrique deux lignes ;<br/>
chacune est une liste de trois zéros.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[[0, 0], [0, 0], [0, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>range(2)</code> est à l'extérieur : il fixe le nombre<br/>
de lignes à deux, et <code>range(3)</code> le nombre de<br/>
colonnes à trois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[0, 0, 0, 0, 0, 0]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les crochets intérieurs créent une liste par<br/>
ligne ; le résultat n'est pas aplati.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[[0, 1, 2], [0, 1, 2]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'expression produite est <code>0</code>, pas <code>j</code> ; la<br/>
variable <code>j</code> ne sert qu'à répéter trois fois.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q56 : Deux lignes qui n'en font qu'une</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<pre><code>ligne = [0, 0, 0]
m = [ligne, ligne]
m[0][0] = 5
print(m)</code></pre>
<p>Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>[ligne, ligne]</code> ne copie pas <code>ligne</code> : il range<br/>
deux fois la même référence. Pour obtenir deux<br/>
lignes indépendantes, on construit chaque ligne<br/>
séparément, par exemple avec<br/>
<code>[[0 for j in range(3)] for i in range(2)]</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, 0, 0], [0, 0, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce serait le cas si les deux lignes étaient des<br/>
listes distinctes ; ici elles sont la même liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>[[5, 0, 0], [5, 0, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>m[0]</code> et <code>m[1]</code> désignent la même liste<br/>
<code>ligne</code> ; la modifier par l'une se voit par<br/>
l'autre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>[[0, 0, 0], [0, 0, 0]]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'affectation <code>m[0][0] = 5</code> modifie bien la<br/>
liste ; elle n'est pas sans effet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, car une liste ne peut pas contenir deux fois la même liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python l'accepte sans broncher ; c'est<br/>
précisément ce qui rend le piège discret.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q57 : Plusieurs valeurs renvoyées par une fonction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une fonction <code>division(a, b)</code> doit renvoyer à la fois le quotient<br/>
et le reste de la division euclidienne de <code>a</code> par <code>b</code>. Quelle<br/>
solution est la plus naturelle en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dès qu'une fonction produit plusieurs résultats de nature fixée, le<br/>
tuple est l'outil adapté : <code>return q, r</code> construit le tuple et<br/>
<code>q, r = division(a, b)</code> le décompose.</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>Renvoyer le tuple <code>(q, r)</code>, décomposé par <code>q, r = division(a, b)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un tuple regroupe des valeurs de rôles fixés, en<br/>
nombre connu. L'affectation multiple le décompose en une ligne,<br/>
sans que personne n'ait à le modifier ensuite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Écrire deux instructions <code>return</code> successives, une par valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la première instruction <code>return</code> termine la fonction.<br/>
La seconde ne serait jamais exécutée et le reste serait perdu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoyer la chaîne <code>"q,r"</code> que l'appelant découpe et reconvertit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : transformer des entiers en texte oblige l'appelant à<br/>
découper puis reconvertir. Un tuple transmet directement les deux<br/>
entiers.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ranger le reste dans une variable extérieure et ne renvoyer que le quotient</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une variable extérieure cache une partie du résultat et<br/>
rend la fonction dépendante de son contexte. Renvoyer les deux<br/>
valeurs ensemble est plus clair et plus sûr.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q58 : Données transmises sans risque de modification</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Les réglages d'un jeu (largeur de la grille, hauteur, nombre de<br/>
vies) sont transmis à de nombreuses fonctions, dont aucune ne doit<br/>
pouvoir les altérer par erreur. Quel choix de structure apporte<br/>
cette garantie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Choisir un tuple pour des données qui ne doivent pas changer<br/>
transforme une erreur silencieuse en erreur signalée : c'est la<br/>
garantie que la liste ne peut pas offrir.</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>Un tuple, car toute tentative de modification en place lève une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un tuple est immuable. Une fonction qui<br/>
tenterait <code>reglages[0] = 50</code> provoquerait une erreur, ce qui<br/>
révèle le bug au lieu de le laisser corrompre les réglages.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste, car une fonction ne peut jamais modifier une liste reçue en paramètre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse. Une liste passée en paramètre est<br/>
partagée avec l'appelant, et <code>reglages[0] = 50</code> dans la fonction<br/>
modifie bien la liste d'origine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste, accompagnée d'un commentaire demandant de ne pas la modifier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un commentaire n'empêche rien. Une faute d'inattention<br/>
dans l'une des fonctions suffirait à modifier les réglages sans<br/>
qu'aucune erreur ne soit signalée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trois variables séparées, recopiées au début de chaque fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : recopier trois valeurs dans chaque fonction alourdit le<br/>
code et n'empêche pas une fonction d'oublier la copie. Le tuple<br/>
regroupe les réglages et les protège d'un coup.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q59 : Bornes d'une tranche</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [10, 20, 30, 40, 50, 60]</code>.<br/>
Que vaut <code>L[1:4]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>L[a:b]</code> contient les éléments d'indice<br/>
$a$, $a + 1$, … jusqu'à $b - 1$ : on en<br/>
obtient $b - a$. La fin est exclue, comme<br/>
pour <code>range(a, b)</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>La liste <code>[20, 30, 40]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la tranche part de<br/>
l'indice $1$ inclus et s'arrête juste<br/>
avant l'indice $4$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[20, 30, 40, 50]</code>, les deux bornes étant incluses</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice de fin est toujours<br/>
exclu, comme dans <code>range(1, 4)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[30, 40, 50]</code>, les indices commençant à $1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le premier élément a l'indice<br/>
$0$. L'élément d'indice $1$ est donc<br/>
<code>20</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[20, 50]</code>, formée des deux éléments aux bornes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une tranche prend tous les<br/>
éléments entre les deux bornes, pas<br/>
seulement les éléments aux bornes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q60 : Début omis</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [3, 1, 4, 1, 5, 9]</code>.<br/>
Que vaut <code>L[:2]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un début omis vaut $0$ : <code>L[:k]</code> donne les<br/>
$k$ premiers éléments.</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>La liste <code>[3, 1]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le début omis vaut $0$.<br/>
On prend les éléments d'indice $0$ à<br/>
$2$ exclu, soit les $2$ premiers.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[4, 1, 5, 9]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>L[2:]</code>. Ici, le nombre<br/>
est placé après les deux-points : c'est<br/>
la fin, pas le début.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[3, 1, 4]</code>, l'indice $2$ étant inclus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fin est exclue, même quand<br/>
le début est omis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[5, 9]</code>, les $2$ derniers éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les $2$ derniers s'écrivent<br/>
<code>L[-2:]</code>. Sans signe moins, on part<br/>
du début.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q61 : Fin omise</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [10, 20, 30, 40, 50]</code>.<br/>
Que vaut <code>L[2:]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une fin omise vaut <code>len(L)</code> : <code>L[k:]</code><br/>
donne tout à partir de l'indice $k$<br/>
inclus. Avec <code>L[:k]</code>, les deux tranches<br/>
se partagent la liste sans chevauchement.</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>La liste <code>[30, 40, 50]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fin omise vaut<br/>
<code>len(L)</code>. On prend tout à partir de<br/>
l'indice $2$ inclus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[10, 20]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>L[:2]</code>, les éléments<br/>
placés avant l'indice $2$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[40, 50]</code>, l'indice $2$ étant exclu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seul l'indice de fin est<br/>
exclu. Le début est toujours inclus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[30]</code>, réduite à l'élément d'indice $2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux-points demandent une<br/>
tranche, qui va ici jusqu'au bout de la<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q62 : Les derniers éléments</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [2, 4, 6, 8, 10]</code>.<br/>
Que vaut <code>L[-2:]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>L[-k:]</code> donne les $k$ derniers éléments,<br/>
<code>L[:-k]</code> tout sauf ces $k$ derniers.</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>La liste <code>[8, 10]</code>, les $2$ derniers éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'indice $-2$ désigne<br/>
le $2$e élément en partant de la fin,<br/>
et la fin omise va jusqu'au bout.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[2, 4]</code>, les $2$ premiers éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un indice négatif se compte à<br/>
partir de la fin de la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[2, 4, 6]</code>, tout sauf les $2$ derniers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>L[:-2]</code>, où $-2$ est<br/>
la fin de la tranche et non son début.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[10, 8]</code>, les $2$ derniers dans l'ordre inverse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans pas négatif, une tranche<br/>
garde toujours l'ordre de la liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q63 : Retirer le premier et le dernier caractère</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>s = "bonjour"</code>.<br/>
Que vaut <code>s[1:-1]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>s[1:-1]</code> retire le premier et le dernier<br/>
caractère. C'est le même découpage sur une<br/>
chaîne que sur une liste.</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>La chaîne <code>'onjou'</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on part de l'indice $1$<br/>
(le <code>'o'</code>) et on s'arrête avant le<br/>
dernier caractère, d'indice $-1$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne <code>'bonjou'</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice $1$ désigne le<br/>
deuxième caractère. Le <code>'b'</code> a l'indice<br/>
$0$ et n'est pas pris.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne <code>'onjour'</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fin $-1$ est exclue, le<br/>
dernier caractère n'est donc pas pris.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, les indices négatifs étant interdits dans une tranche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les indices négatifs sont<br/>
permis dans une tranche, comme dans<br/>
un accès simple.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q64 : Un élément sur deux</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [10, 11, 12, 13, 14, 15, 16]</code>.<br/>
Que vaut <code>L[1::2]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>L[début:fin:pas]</code> : le pas est l'écart<br/>
entre deux indices pris. <code>L[::2]</code> prend<br/>
les indices pairs, <code>L[1::2]</code> les indices<br/>
impairs.</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>La liste <code>[11, 13, 15]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on part de l'indice<br/>
$1$ et on avance de $2$ en $2$<br/>
jusqu'au bout de la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[10, 12, 14, 16]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un élément sur deux,<br/>
mais à partir de l'autre indice de<br/>
départ. Ici, le départ est $1$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[11]</code>, le $2$ étant la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec deux fois deux-points, le<br/>
nombre placé en dernier est le pas,<br/>
pas la fin.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[13, 14, 15, 16]</code>, le $2$ s'ajoutant au début</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le troisième nombre est<br/>
l'écart entre deux indices pris, pas un<br/>
décalage du début.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q65 : Inverser une chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>mot = "python"</code>.<br/>
Que vaut <code>mot[::-1]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>mot[::-1]</code> renvoie la séquence à<br/>
l'envers. Cela marche aussi sur une liste<br/>
ou un 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="100" format="html">
    <text><![CDATA[<p>La chaîne <code>'nohtyp'</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec un pas de $-1$,<br/>
on parcourt la chaîne de la fin vers le<br/>
début.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne <code>'pytho'</code>, sans le dernier caractère</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>mot[:-1]</code>. Ici, $-1$<br/>
est en troisième position : c'est le<br/>
pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne <code>'n'</code>, le dernier caractère</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>mot[-1]</code>, un accès à un<br/>
seul caractère, sans deux-points.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne <code>'ython'</code>, sans le premier caractère</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est <code>mot[1:]</code>. Un pas<br/>
négatif ne retire rien, il renverse<br/>
l'ordre.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q66 : Tester un palindrome</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>def est_palindrome(mot):
    return mot == mot[::-1]

print(est_palindrome("kayak"))
print(est_palindrome("radis"))</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un mot est un palindrome quand il est égal<br/>
à son inverse : <code>mot == mot[::-1]</code> le teste<br/>
en une seule ligne.</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>Il affiche <code>True</code> puis <code>False</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>"kayak"</code> se lit de la<br/>
même façon dans les deux sens, pas<br/>
<code>"radis"</code>, qui donne <code>"sidar"</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>True</code> puis <code>True</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>"radis"[::-1]</code> vaut <code>"sidar"</code>,<br/>
qui est différent de <code>"radis"</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>False</code> puis <code>False</code>, <code>mot[::-1]</code> ne changeant rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec un pas de $-1$, la chaîne<br/>
est bien renversée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, une chaîne ne pouvant pas être comparée à une tranche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une tranche de chaîne est une<br/>
chaîne, la comparaison est donc<br/>
possible.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q67 : Indexation ou tranche</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>L = ['a', 'b', 'c', 'd']
x = L[1]
y = L[1:2]</code></pre><br/>
Que valent <code>x</code> et <code>y</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'indexation renvoie un élément, la<br/>
tranche renvoie une nouvelle séquence. On<br/>
ne peut donc pas écrire <code>L[1:2] + 1</code> si<br/>
<code>L</code> contient des nombres.</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>x</code> vaut <code>'b'</code> et <code>y</code> vaut <code>['b']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>L[1]</code> est un élément,<br/>
<code>L[1:2]</code> est une liste qui contient cet<br/>
élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>x</code> et <code>y</code> valent tous deux <code>'b'</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec deux-points, le résultat<br/>
est toujours une liste, même s'il n'a<br/>
qu'un élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>x</code> et <code>y</code> valent tous deux <code>['b']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans deux-points, on accède à<br/>
l'élément lui-même, ici une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>x</code> vaut <code>'b'</code> et <code>y</code> vaut <code>['b', 'c']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice de fin $2$ est exclu,<br/>
seul l'élément d'indice $1$ est pris.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q68 : Tranche qui dépasse la liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [1, 2, 3, 4]</code>.<br/>
Que vaut <code>L[2:10]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Contrairement à <code>L[i]</code>, une tranche ne<br/>
déclenche jamais d'erreur d'indice : les<br/>
bornes trop grandes sont ramenées à la<br/>
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="100" format="html">
    <text><![CDATA[<p>La liste <code>[3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une borne trop grande<br/>
est ramenée à la longueur de la liste,<br/>
sans erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur <code>IndexError</code>, l'indice $10$ n'existant pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seul l'accès à un élément,<br/>
comme <code>L[10]</code>, provoque <code>IndexError</code>.<br/>
Une tranche s'arrête au bout de la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[3, 4, None, None, None, None, None, None]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une tranche ne crée pas<br/>
d'éléments, elle prend seulement ceux<br/>
qui existent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste vide <code>[]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les éléments d'indice $2$ et<br/>
$3$ existent et sont pris.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q69 : Tranche vide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [5, 6, 7, 8, 9]</code>.<br/>
Que vaut <code>L[3:1]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avec un pas positif, si le début n'est pas<br/>
avant la fin, la tranche 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="100" format="html">
    <text><![CDATA[<p>La liste vide <code>[]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec le pas $1$ par<br/>
défaut, on avance vers la droite. Partir<br/>
de l'indice $3$ pour s'arrêter avant<br/>
l'indice $1$ ne prend aucun élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[8, 7]</code>, parcourue à l'envers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faudrait un pas négatif,<br/>
<code>L[3:1:-1]</code>, pour aller vers la gauche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[6, 7]</code>, les bornes étant remises dans l'ordre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne réordonne pas les<br/>
bornes. <code>[6, 7]</code> est <code>L[1:3]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, le début étant plus grand que la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une tranche ne déclenche pas<br/>
d'erreur ; elle est simplement vide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q70 : Modifier une tranche</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>L = [1, 2, 3, 4]
T = L[1:3]
T[0] = 99
print(L)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une tranche fabrique une nouvelle<br/>
séquence. C'est pourquoi <code>L[:]</code> sert à<br/>
copier une liste.</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>Il affiche <code>[1, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>T</code> est une nouvelle<br/>
liste, <code>[2, 3]</code>. La modifier ne change<br/>
pas <code>L</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[1, 99, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le cas si <code>T</code> était<br/>
un autre nom de la même liste. Une<br/>
tranche est une copie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>[99, 2, 3, 4]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>T[0]</code> est le premier élément<br/>
de <code>T</code>, et <code>T</code> est de toute façon<br/>
distincte de <code>L</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, une tranche ne pouvant pas être modifiée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>T</code> est une liste ordinaire, on<br/>
peut la modifier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q71 : Remplacer une portion de liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>L = ['a', 'b', 'c', 'd', 'e']
L[1:3] = ['X', 'Y', 'Z']
print(L)</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sur une liste, on peut affecter une<br/>
tranche : la portion choisie est remplacée<br/>
par une autre, de taille quelconque.</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>Il affiche <code>['a', 'X', 'Y', 'Z', 'd', 'e']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les éléments d'indice<br/>
$1$ et $2$ (<code>'b'</code> et <code>'c'</code>) sont remplacés<br/>
par les trois nouveaux. La liste<br/>
s'allonge d'un élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>['a', 'X', 'Y', 'd', 'e']</code>, la liste gardant sa taille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tous les éléments de droite<br/>
sont insérés, même s'ils sont plus<br/>
nombreux que ceux qu'ils remplacent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche <code>['a', 'X', 'Y', 'Z', 'e']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fin $3$ est exclue, <code>'d'</code><br/>
n'est pas remplacé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, les deux tailles étant différentes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec un pas de $1$, Python<br/>
accepte un remplacement de taille<br/>
différente.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q72 : Modifier une tranche de chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>s = "python"
s[0:2] = "PY"</code></pre><br/>
Que se passe-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>On découpe une chaîne librement, mais on<br/>
ne la modifie pas : pour changer des<br/>
caractères, on fabrique une nouvelle<br/>
chaîne avec des tranches et <code>+</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>Une erreur <code>TypeError</code> : une chaîne ne se modifie pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une chaîne est<br/>
immuable. On construit une nouvelle<br/>
chaîne : <code>s = "PY" + s[2:]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>s</code> devient <code>'PYthon'</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'affectation d'une tranche<br/>
n'est permise que sur une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>s</code> devient <code>'PYpython'</code>, <code>"PY"</code> étant inséré au début</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : même sur une liste, la portion<br/>
serait remplacée et non complétée. Et<br/>
sur une chaîne, Python refuse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>s</code> reste <code>'python'</code>, sans message d'erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python signale l'opération<br/>
interdite par une erreur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q73 : Rotation d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>L = [1, 2, 3, 4, 5]</code>.<br/>
Que vaut <code>L[2:] + L[:2]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>L[k:] + L[:k]</code> fait tourner la liste de<br/>
$k$ crans vers la gauche : les $k$ premiers<br/>
éléments passent à la fin.</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>La liste <code>[3, 4, 5, 1, 2]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on met la fin de la<br/>
liste (à partir de l'indice $2$)<br/>
devant ses $2$ premiers éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[4, 5, 1, 2, 3]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la rotation dans l'autre<br/>
sens, <code>L[-2:] + L[:-2]</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[1, 2, 3, 4, 5]</code>, inchangée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre des deux morceaux<br/>
compte. Ici, la fin passe devant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>[3, 4, 5]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>+</code> met bout à bout les deux<br/>
tranches, aucun élément n'est perdu.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q74 : Tranche d'un tuple avec un pas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de <code>T = ('a', 'b', 'c', 'd', 'e')</code>.<br/>
Que vaut <code>T[::2]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les tuples acceptent toutes les tranches,<br/>
pas compris : seule l'affectation d'une<br/>
tranche leur est interdite.</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>Le tuple <code>('a', 'c', 'e')</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un élément sur deux à<br/>
partir de l'indice $0$, et le résultat<br/>
est un tuple, comme <code>T</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste <code>['a', 'c', 'e']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une tranche garde le type de<br/>
départ. Sur un tuple, elle renvoie un<br/>
tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tuple <code>('b', 'd')</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont les indices impairs,<br/>
<code>T[1::2]</code>. Sans début, on part de<br/>
l'indice $0$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tuple <code>('a', 'b')</code>, les deux premiers éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le $2$ est ici le pas, pas la<br/>
fin : il faudrait <code>T[:2]</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
