<?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/>
méthodes principales (append, pop, len, etc.),<br/>
différences entre tuples et listes, cas d'usage,<br/>
découpage (<em>slicing</em>), affectation multiple.</p>]]></text>
  </info>
</question>

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q02 : Création d'un tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment crée-t-on un <strong>tuple</strong> en<br/>
Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une distinction subtile : (1) est<br/>
simplement l'entier 1 entouré<br/>
de parenthèses de groupement,<br/>
tandis que (1,) est un tuple à<br/>
un seul élément. C'est la<br/>
virgule, et non les parenthèses,<br/>
qui crée le tuple.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe t = tuple[1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe est invalide en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec t = (), t = (1, 2, 3), ou même t = 1, 2, 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les parenthèses sont souvent<br/>
facultatives ; ce sont les<br/>
virgules qui définissent un<br/>
tuple. Pour un tuple à un<br/>
seul élément, la virgule est<br/>
obligatoire : t = (1,).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe t = {1, 2, 3}</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les accolades autour de<br/>
plusieurs éléments séparés<br/>
par des virgules créent un<br/>
<strong>ensemble</strong> (set), pas un<br/>
tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe t = []</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les crochets servent à créer<br/>
une liste, et non un tuple.</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<br/>
fondamentale</strong> entre un tuple et<br/>
une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La mutabilité désigne la<br/>
possibilité d'être modifié.<br/>
L'instruction liste.append(x)<br/>
modifie la liste sur place. Sur<br/>
un tuple, l'appel<br/>
tuple.append(x) provoque une<br/>
exception AttributeError.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple a forcément 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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La différence porte<br/>
précisément sur la mutabilité,<br/>
comme expliqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une liste est mutable (modifiable après sa création), tandis qu'un tuple est immuable (figé une fois créé)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>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>La couleur d'affichage dans l'éditeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description littérale<br/>
n'a aucun rapport avec la<br/>
notion technique. La<br/>
différence concerne la<br/>
mutabilité.</p>]]></text>
    </feedback>
  </answer>
</question>

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

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

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

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

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

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

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

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

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q13 : Méthode pop</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait l'appel liste.pop() ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Combinées, les méthodes append<br/>
et pop permettent d'ajouter<br/>
et de retirer des éléments à la<br/>
fin d'une liste. Ces deux<br/>
opérations sont très courantes<br/>
pour gérer dynamiquement le<br/>
contenu d'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>Elle retire et renvoie le dernier élément de la liste, en O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Avec un argument, pop(i)<br/>
retire et renvoie l'élément<br/>
d'indice i. Cette opération<br/>
est en O(n) pour<br/>
i ≠ -1, à cause du<br/>
décalage des éléments<br/>
suivants.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle se contente d'afficher le dernier élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode pop modifie la<br/>
liste <strong>et</strong> renvoie la<br/>
valeur retirée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle compte le nombre d'éléments de la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le comptage des éléments se<br/>
fait avec la fonction len.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle trie la liste sur place</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le tri sur place se fait<br/>
avec la méthode sort.</p>]]></text>
    </feedback>
  </answer>
</question>

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q15 : Méthodes sort et sorted</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre<br/>
liste.sort() et sorted(liste) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention Python : les verbes<br/>
à la voix passive (sorted,<br/>
reversed) renvoient une<br/>
version transformée sans<br/>
modifier l'original ; les<br/>
noms d'action (sort,<br/>
reverse) modifient sur<br/>
place.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La méthode sort est plus lente</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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une différence importante<br/>
existe, comme expliqué<br/>
dans la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction sorted ne fonctionne que sur des nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction sorted<br/>
fonctionne sur tout type<br/>
comparable (entiers,<br/>
chaînes, tuples, etc.).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La méthode sort modifie la liste sur place (et renvoie None), tandis que la fonction sorted renvoie une nouvelle liste triée sans modifier l'originale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le choix dépend du besoin :<br/>
si l'on veut conserver<br/>
l'original, on utilise<br/>
sorted ; sinon, sort<br/>
est préférable. La<br/>
fonction sorted<br/>
fonctionne aussi sur les<br/>
tuples, contrairement à<br/>
sort.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q16 : Compréhension de liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code crée la liste des<br/>
carrés des entiers de 1 à 10 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quatre formes de compréhension<br/>
existent : [] pour les<br/>
listes, {} pour les<br/>
ensembles, {k: v for ...}<br/>
pour les dictionnaires, et<br/>
(...) pour les générateurs.<br/>
Toutes sont très utilisées en<br/>
Python idiomatique.</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>for i in range(1, 11): liste.append(i  2)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette construction sur<br/>
plusieurs lignes<br/>
fonctionne, mais la<br/>
compréhension de liste est<br/>
plus idiomatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[i  2 for i in range(1, 11)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est une <strong>compréhension de<br/>
liste</strong>, une syntaxe concise<br/>
et idiomatique en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>(i  2 for i in range(1, 11))</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe crée une<br/>
<strong>expression génératrice</strong>,<br/>
parcourable une seule fois,<br/>
et non une liste. Avec<br/>
list(...) autour, on<br/>
obtiendrait bien une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>{i  2 for i in range(1, 11)}</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe crée un<br/>
<strong>ensemble</strong> (set), pas<br/>
une liste.</p>]]></text>
    </feedback>
  </answer>
</question>

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q18 : Retours multiples par tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie cette fonction ?<br/>
`<code>python<br/>
def min_max(l):<br/>
    return min(l), max(l)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cet idiome est très courant<br/>
en Python. Il évite de<br/>
définir une classe ad hoc<br/>
pour transporter deux valeurs<br/>
liées.</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>Une chaîne de caractères</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction renvoie deux<br/>
valeurs numériques, pas<br/>
une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur None</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction renvoie bien<br/>
quelque chose, à savoir un<br/>
tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste contenant deux éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La virgule entre les deux<br/>
valeurs renvoyées crée un<br/>
tuple, et non une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un tuple de la forme (min, max)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La virgule entre deux<br/>
valeurs construit un tuple.<br/>
C'est l'idiome Python pour<br/>
renvoyer plusieurs valeurs.<br/>
On les récupère ensuite par<br/>
dépaquetage :<br/>
mn, mx = min_max(...).</p>]]></text>
    </feedback>
  </answer>
</question>

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q20 : Tuple à un élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut l'expression len((42)) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est un piège classique : il<br/>
faut toujours penser à la<br/>
virgule pour les tuples à un<br/>
seul élément. Pour vérifier,<br/>
type((42)) renvoie int,<br/>
tandis que type((42,))<br/>
renvoie tuple.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune valeur de longueur<br/>
n'est calculée ; la<br/>
fonction len lève une<br/>
exception sur un entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une exception (TypeError), car la fonction len n'est pas définie sur les entiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour créer un tuple à un<br/>
seul élément, il faut une<br/>
virgule : (42,). Sans<br/>
cette virgule, on a juste<br/>
un entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur 42</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction len ne<br/>
renvoie pas la valeur de<br/>
son argument.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'expression (42) n'est<br/>
pas un tuple, mais<br/>
simplement l'entier 42<br/>
entouré de parenthèses de<br/>
groupement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q21 : Trace de pop</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
l = [10, 20, 30]<br/>
x = l.pop(0)<br/>
print(x, l)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Performance : pop(-1) est<br/>
en O(1), alors que<br/>
pop(0) est en O(n) à<br/>
cause du décalage de tous<br/>
les éléments. Mieux vaut<br/>
donc retirer les éléments<br/>
par la fin de la liste<br/>
lorsque c'est possible.</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 sortie 30 [10, 20]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Sans argument, pop()<br/>
retire le dernier<br/>
élément. Mais ici, on a<br/>
précisé l'indice 0 :<br/>
c'est donc le premier<br/>
élément qui est retiré.</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 0 est valide<br/>
pour une liste de trois<br/>
éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La sortie 10 [10, 20, 30]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode pop modifie<br/>
la liste sur place,<br/>
contrairement à ce que<br/>
suggère cette réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La sortie 10 [20, 30]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'appel pop(0) retire et<br/>
renvoie l'élément d'indice<br/>
0, c'est-à-dire 10. La<br/>
liste devient alors<br/>
[20, 30].</p>]]></text>
    </feedback>
  </answer>
</question>

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q23 : Méthodes append et extend</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre<br/>
les méthodes append et extend<br/>
d'une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une autre forme équivalente :<br/>
liste += iterable revient<br/>
à liste.extend(iterable).</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 méthode append(x) ajoute x comme un seul élément ; la méthode extend(iterable) ajoute chaque élément de l'itérable un par un</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Par exemple,<br/>
[1].append([2, 3]) donne<br/>
[1, [2, 3]], alors que<br/>
[1].extend([2, 3])<br/>
donne [1, 2, 3]. La<br/>
distinction est subtile<br/>
mais importante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence notable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une différence importante<br/>
existe, comme expliqué<br/>
dans la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La méthode append est plus rapide qu'extend</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les performances sont<br/>
équivalentes pour ajouter<br/>
un élément. La distinction<br/>
porte sur le sens de<br/>
l'opération.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La méthode extend n'existe pas en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette méthode existe bel<br/>
et bien et fait partie de<br/>
l'interface standard des<br/>
listes.</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</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, qui signale clairement l'immuabilité, est légèrement plus rapide à créer et consomme un peu moins de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Par exemple,<br/>
JOURS = ("lun", "mar",<br/>
"mer", ...). Le lecteur<br/>
du code comprend<br/>
immédiatement que ces<br/>
données ne changeront<br/>
pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une liste fonctionnerait,<br/>
mais on perdrait<br/>
l'information précieuse<br/>
de l'immuabilité, qui<br/>
aide à la lecture du<br/>
code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une chaîne de caractères</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une chaîne n'est pas<br/>
adaptée pour stocker des<br/>
éléments séparés, sauf<br/>
dans des cas<br/>
particuliers.</p>]]></text>
    </feedback>
  </answer>
</question>

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q26 : Renverser une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose d'une liste t = [10, 20, 30, 40, 50].<br/>
Que vaut t[::-1] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le découpage généralisé liste[debut:fin:pas]<br/>
permet de nombreux traitements rapides :<br/>
t[::-1] (inversion), t[::2] (un élément sur<br/>
deux), t[1::2] (à partir de l'indice 1, un sur<br/>
deux), t[-3:] (les trois derniers). Tous<br/>
produisent une <strong>nouvelle</strong> liste sans modifier<br/>
l'originale.</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>[50, 40, 30, 20, 10]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la syntaxe [::-1] produit une<br/>
nouvelle liste contenant les éléments de t<br/>
dans l'ordre inverse. La liste d'origine n'est<br/>
pas modifiée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[10, 20, 30, 40, 50]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait la liste d'origine. Le pas<br/>
négatif -1 indique au contraire de parcourir<br/>
la séquence dans le sens inverse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur d'indice</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide. Le découpage<br/>
[debut:fin:pas] accepte parfaitement un pas<br/>
négatif lorsqu'on souhaite parcourir la<br/>
séquence à l'envers.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste produite n'est pas vide. Le<br/>
pas -1 signifie « parcours en arrière », pas<br/>
« efface ».</p>]]></text>
    </feedback>
  </answer>
</question>

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

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

</quiz>
