<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Tuples et listes</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Types construits : tuples (immuables) et listes<br/>
(mutables), création, accès par indice, parcours,<br/>
ajout avec append, longueur avec len,<br/>
appartenance avec in, 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 []), 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="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>
  <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="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>
</question>

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q03 : Mutabilité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la <strong>différence fondamentale</strong> entre un tuple et<br/>
une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La mutabilité désigne la<br/>
possibilité d'être modifié.<br/>
L'instruction liste.append(x)<br/>
modifie la liste sur place. Sur<br/>
un tuple, l'appel<br/>
tuple.append(x) provoque une<br/>
exception AttributeError.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple ne contient que des nombres, une liste tout type</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un tuple accepte n'importe quels<br/>
objets, comme une liste (("a", 1, [2])<br/>
est valide). La différence concerne la<br/>
mutabilité.</p>]]></text>
    </feedback>
  </answer>
  <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 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>
</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>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/>
len(liste) - 1. Un indice<br/>
supérieur ou égal à n lève une<br/>
exception IndexError.</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 "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="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>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>
  <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>
</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.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="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 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>
  <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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q06 : Ajouter à une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>ajoute-t-on</strong> l'élément<br/>
42 à la fin d'une liste liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Différence importante : la<br/>
méthode append modifie la<br/>
liste sur place, alors que<br/>
l'opérateur + crée une<br/>
nouvelle liste. Pour ajouter<br/>
plusieurs éléments d'un coup, on<br/>
écrit liste = liste + [4, 5, 6].</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="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 += 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.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>
  <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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q07 : Parcours d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>parcourt-on</strong> tous les<br/>
éléments d'une liste pour les<br/>
afficher ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour parcourir une liste avec un<br/>
indice, on écrit<br/>
for i in range(len(liste)):.<br/>
On dispose alors à la fois de<br/>
l'indice i et de la valeur<br/>
liste[i] à chaque tour de boucle.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
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="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/>
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>
  <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>
</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>On peut aussi écrire ce test soi-même : une boucle for 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 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 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 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>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="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>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="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/>
3 : la longueur passe<br/>
de 3 à 4, et non à 5.</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>
  <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>
</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 t = [10, 20, 30, 40, 50]. Que vaut<br/>
l'expression [t[i] for i in range(1, 4)] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans range(a, b), la borne a<br/>
est incluse et la borne b<br/>
exclue. La compréhension<br/>
[t[i] for i in range(a, b)]<br/>
construit donc la liste des<br/>
éléments d'indices a à b - 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 [10, 20, 30]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les indices commencent à 0 :<br/>
t[1] 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 [20, 30, 40]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>range(1, 4) 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 [1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont les indices produits<br/>
par range(1, 4). La<br/>
compréhension ne garde pas i<br/>
mais t[i], l'élément situé à<br/>
cet indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [20, 30, 40, 50]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La borne haute de range 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 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>L'affectation multiple sert aussi à récupérer d'un coup les valeurs<br/>
d'un p-uplet renvoyé par une fonction : si f() renvoie (4, 7),<br/>
l'instruction x, y = f() 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>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>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>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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q13 : Retirer le dernier élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose de l = [10, 20, 30]. Quelle expression<br/>
fournit une <strong>nouvelle</strong> liste contenant tous les<br/>
éléments de l sauf le dernier, quelle que soit la<br/>
longueur de l ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans la compréhension [l[i] for i in range(n)],<br/>
les indices vont de 0 à n - 1. En prenant<br/>
len(l) - 1 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="100" format="html">
    <text><![CDATA[<p>[l[i] for i in range(len(l) - 1)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : range(len(l) - 1) produit<br/>
les indices de 0 à len(l) - 2, soit tous<br/>
sauf celui du dernier élément. On obtient<br/>
[10, 20] dans une nouvelle liste ; l n'est<br/>
pas modifiée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[l[i] for i in range(1, len(l))]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les indices vont de 1 à<br/>
len(l) - 1, ce qui retire le <strong>premier</strong><br/>
élément. Sur l'exemple, on obtient<br/>
[20, 30].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[l[i] for i in range(len(l) - 2)]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne len(l) - 2 étant exclue,<br/>
les indices s'arrêtent à len(l) - 3 et les<br/>
<strong>deux</strong> derniers éléments disparaissent. Sur<br/>
l'exemple, on obtient [10].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>l[len(l) - 1]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans compréhension, les crochets font<br/>
un accès par indice. l[len(l) - 1] 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>`<code>python<br/>
def bornes(notes):<br/>
    mini = notes[0]<br/>
    maxi = notes[0]<br/>
    for n in notes:<br/>
        if n &lt; mini:<br/>
            mini = n<br/>
        if n &gt; maxi:<br/>
            maxi = n<br/>
    return (mini, maxi)<br/>
resultat = bornes([12, 8, 15, 10])<br/>
</code><br/>
Que contient la variable resultat` 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 resultat[0] et resultat[1],<br/>
ou directement avec bas, haut = bornes([12, 8, 15, 10]).</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 [8, 15]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les parenthèses de return (mini, maxi) 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>Le tuple (15, 8)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'ordre des valeurs est celui écrit dans<br/>
return (mini, maxi) : d'abord le minimum, puis le maximum.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le tuple (8, 15)</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 return (mini, maxi) renvoie un<br/>
p-uplet de deux valeurs, qui est affecté à resultat.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'entier 8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : return ne s'arrête pas à la première valeur. Il renvoie<br/>
le p-uplet entier (mini, maxi), qui contient les deux notes.</p>]]></text>
    </feedback>
  </answer>
</question>

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

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q18 : Réaffecter la variable de boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
l = [1, 2, 3]<br/>
for x in l:<br/>
    x = x * 2<br/>
print(l)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour transformer les éléments d'une liste, on<br/>
parcourt les indices et on écrit dans la liste :<br/>
for i in range(len(l)): l[i] = l[i] * 2. La<br/>
variable x d'un for x in l n'est qu'un nom<br/>
temporaire posé sur chaque élément.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il 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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3, 2, 4, 6]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune instruction n'ajoute d'élément<br/>
à l. Seule la méthode append allongerait la<br/>
liste ; ici on ne fait que réaffecter x.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : réaffecter la variable de boucle<br/>
ne modifie jamais la liste. À chaque tour, x<br/>
désigne un élément, puis reçoit un nouvel<br/>
entier ; la liste n'est pas touchée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche [2, 4, 6]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : x = x <em> 2 crée un nouvel entier et le<br/>
range dans x, sans rien écrire dans la liste.<br/>
Pour doubler les éléments, il faut écrire<br/>
l[i] = l[i] </em> 2 en parcourant les indices.</p>]]></text>
    </feedback>
  </answer>
</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 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="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="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 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 42, l'unique élément du tuple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : len ne renvoie pas la valeur<br/>
de son argument, et (42) n'est pas un<br/>
tuple.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur 0, car le tuple (42) est considéré comme vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : (42) n'est pas un tuple du<br/>
tout, et len lève une exception sur un<br/>
entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur entière 1, comme on pourrait l'attendre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'expression (42) n'est<br/>
pas un tuple, mais<br/>
simplement l'entier 42<br/>
entouré de parenthèses de<br/>
groupement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une exception TypeError</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : (42) n'est pas un tuple<br/>
mais l'entier 42 entre parenthèses, et<br/>
len n'agit pas sur un entier. Pour créer<br/>
un tuple à un seul élément, il faut une<br/>
virgule : (42,).</p>]]></text>
    </feedback>
  </answer>
</question>

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

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

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q24 : Tuples pour les constantes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour stocker des <strong>constantes</strong><br/>
que l'on ne modifiera jamais,<br/>
quelle structure est la plus<br/>
indiquée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention Python : on<br/>
utilise les tuples pour les<br/>
données figées, et les<br/>
listes pour les données qui<br/>
évoluent au cours du<br/>
programme. Cette distinction<br/>
améliore la lisibilité du<br/>
code.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>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="100" format="html">
    <text><![CDATA[<p>Un tuple, immuable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le tuple signale<br/>
l'immuabilité et reste un peu plus<br/>
léger qu'une liste. Par exemple,<br/>
JOURS = ("lun", "mar",<br/>
"mer", ...). Le lecteur<br/>
du code comprend<br/>
immédiatement que ces<br/>
données ne changeront<br/>
pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une 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>
  <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>
</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="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>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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux structures supportent l'indexation et la fonction len</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est correcte : on peut écrire s[0] ou len(s)<br/>
aussi bien sur une liste que sur un tuple.</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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q26 : Renverser une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose d'une liste t = [10, 20, 30, 40, 50] et<br/>
l'on veut construire une nouvelle liste r contenant<br/>
les mêmes éléments dans l'ordre inverse, soit<br/>
[50, 40, 30, 20, 10]. Quel code convient ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Construire la liste renversée revient à insérer<br/>
chaque élément en tête, ou à lire la liste de la fin<br/>
vers le début avec les indices len(t) - 1 - i.<br/>
Dans les deux cas, t n'est pas modifiée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for x in t:<br/>
    r = [x] + r<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque tour, [x] + r place<br/>
le nouvel élément <strong>devant</strong> ceux déjà rangés.<br/>
r vaut successivement [10], [20, 10],<br/>
[30, 20, 10], jusqu'à [50, 40, 30, 20, 10].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for i in range(len(t) - 1):<br/>
    r.append(t[len(t) - 1 - i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice len(t) - 1 - i lit bien la<br/>
liste depuis la fin, mais range(len(t) - 1) ne<br/>
fait que 4 tours. Le résultat<br/>
[50, 40, 30, 20] oublie le premier élément, 10.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for i in range(len(t)):<br/>
    r.append(t[len(t) - i])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au premier tour, t[len(t) - 0] vaut<br/>
t[5], hors de la liste, d'où une IndexError.<br/>
Il faudrait écrire t[len(t) - 1 - i].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
r = []<br/>
for x in t:<br/>
    r.append(x)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chaque élément est ajouté à la fin de<br/>
r dans l'ordre de parcours. On obtient une<br/>
simple copie [10, 20, 30, 40, 50].</p>]]></text>
    </feedback>
  </answer>
</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>`<code>python<br/>
t = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]<br/>
compteur = 0<br/>
premier = -1<br/>
for i in range(len(t)):<br/>
    if t[i] == 5:<br/>
        compteur = compteur + 1<br/>
        if premier == -1:<br/>
            premier = i<br/>
print(compteur, premier)<br/>
</code>`<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 range, 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>3 5</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>3 10</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait l'indice de la <strong>dernière</strong> occurrence. Le test<br/>
premier == -1 n'est vrai qu'au premier 5 rencontré ; ensuite<br/>
premier vaut 4 et n'est plus modifié.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les rôles sont inversés. compteur vaut le nombre<br/>
d'occurrences, 3, et premier l'indice de la première, 4 ;<br/>
print les affiche dans cet ordre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3 4</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 premier ne reçoit un indice que tant<br/>
qu'elle vaut -1, donc seulement à la première occurrence : 4.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q28 : append, extend et concaténation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On exécute :</p>
<p>`<code>python<br/>
a = [1, 2, 3]<br/>
b = [4, 5]<br/>
a.append(b)<br/>
</code></p>
<p>Que vaut la liste a` après cette exécution ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux opérations à distinguer : a.append(x)<br/>
ajoute x à la fin de a comme un seul élément,<br/>
en modifiant a sur place ; a + b produit une<br/>
<strong>nouvelle</strong> liste formée des éléments de a<br/>
puis de ceux de b, sans modifier ni a ni b.<br/>
Pour obtenir [1, 2, 3, 4, 5] dans a, on écrit<br/>
donc a = a + b. Confondre les deux est l'une des<br/>
erreurs les plus fréquentes en Python.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code lève une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode append accepte n'importe<br/>
quel objet, y compris une liste. Le code<br/>
s'exécute sans erreur, même si le résultat<br/>
peut surprendre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[1, 2, 3, 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le résultat de<br/>
a = a + b, qui enchaîne les éléments de b<br/>
un par un après ceux de a. La méthode<br/>
append, elle, ajoute son paramètre comme un<br/>
<strong>unique élément</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[[1, 2, 3], 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append ajoute en <strong>fin</strong> de liste,<br/>
pas au début. Et c'est b qui est ajouté, pas<br/>
a.</p>]]></text>
    </feedback>
  </answer>
  <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>
</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 eleve = ("Ana", 15, True)<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 : ("Ana", 15, True) 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>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>
  <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>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>
</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 l = [1, 2, 3] ?</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/>
tuple(l) dans un sens, list(t) 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 t = tuple(l)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tuple(l) construit un<br/>
nouveau tuple avec les mêmes éléments.<br/>
La conversion inverse s'écrit<br/>
list(t).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec t = (l)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : des parenthèses autour d'une<br/>
liste ne changent rien, t reste la<br/>
même liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec t = l.freeze()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette méthode n'existe pas en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec t = l.tuple()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les listes n'ont pas de<br/>
méthode tuple. La conversion se fait<br/>
par la fonction tuple.</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>`<code>python<br/>
a = 1<br/>
b = 2<br/>
a, b = b, a<br/>
print(a, b)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette ligne cache un tuple : Python<br/>
évalue b, a, ce qui donne (2, 1),<br/>
puis déballe ce tuple dans a, b. 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 2 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la partie droite<br/>
construit d'abord le tuple (2, 1),<br/>
puis ses deux valeurs sont rangées<br/>
dans a et b. L'échange se fait<br/>
sans variable intermédiaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche 1 2</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 2 2, car a 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/>
(a = b puis b = a). 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 t = (3, 1, 4, 1, 5).<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 : count et index.<br/>
Toutes celles qui transforment la<br/>
structure (append, sort, remove)<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="0" format="html">
    <text><![CDATA[<p>t.append(9), qui ajoute 9 à la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append modifierait le<br/>
tuple, ce qui est impossible.<br/>
L'exécution lève une exception<br/>
AttributeError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>t[0] = 7, 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 TypeError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>t.count(1), qui renvoie 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : count compte les<br/>
occurrences d'une valeur et index<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>t.sort(), qui range les valeurs dans l'ordre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sort trie sur place, donc<br/>
modifie. Sur un tuple, on passe par<br/>
sorted(t), qui renvoie une nouvelle<br/>
liste triée.</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>`<code>python<br/>
t = (10, 20, 30)<br/>
for i in range(len(t)):<br/>
    print(t[i])<br/>
</code>`<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/>
for v in t, ou avec len. 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="0" format="html">
    <text><![CDATA[<p>Il affiche 0, 1 puis 2, c'est-à-dire les indices</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : t[i] désigne la valeur<br/>
rangée à l'indice i, pas l'indice<br/>
lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche (10, 20, 30) en une seule ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le print est à l'intérieur<br/>
de la boucle, il s'exécute une fois<br/>
par tour.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche 10, 20 puis 30, 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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q34 : Ajouter à un tuple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
t = (1, 2)<br/>
u = t + (3,)<br/>
print(t, u)<br/>
</code>`<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/>
t += (3,) ne fait pas exception, cette<br/>
écriture range un nouveau tuple dans 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>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 (1, 2, 3) (1, 2, 3)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : t n'est pas modifié, un<br/>
tuple ne peut pas l'être. Seul u<br/>
contient la valeur 3 en plus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche (1, 2) (1, 2, (3,))</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le + 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche (1, 2) (1, 2, 3)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la concaténation<br/>
construit un <strong>nouveau</strong> tuple u,<br/>
sans toucher à t. C'est la seule<br/>
façon d'« agrandir » un tuple.</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>`<code>python<br/>
eleves = [("Ana", 12), ("Bilal", 9)]<br/>
for prenom, note in eleves:<br/>
    print(prenom, note)<br/>
</code>`<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 : prenom et note<br/>
disent ce que contiennent les deux<br/>
champs, là où eleve[0] et eleve[1]<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="0" format="html">
    <text><![CDATA[<p>C'est une erreur : il faudrait écrire for eleve in eleves puis eleve[0]</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>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="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 prenom et le second<br/>
dans note.</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 point = (3, 7) 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="0" format="html">
    <text><![CDATA[<p>On écrit point.append(5) puis on retire l'ancienne valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append n'existe pas sur un<br/>
tuple, et ajouter ne remplacerait pas<br/>
l'abscisse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On écrit point[0] = 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette affectation lève une<br/>
exception TypeError, un tuple<br/>
n'accepte aucune modification.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On écrit point.modifier(0, 5)</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="100" format="html">
    <text><![CDATA[<p>On construit un nouveau tuple : point = (5, point[1])</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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q37 : Un tuple qui contient une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
t = ([1, 2], 3)<br/>
t[0].append(9)<br/>
print(t)<br/>
</code>`<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="0" format="html">
    <text><![CDATA[<p>Il affiche ([1, 2], 3), la modification étant perdue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append 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 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 ([1, 2], 3, 9)</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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche ([1, 2, 9], 3)</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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q38 : Trier des tuples</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut<br/>
sorted([(2, "b"), (1, "z"), (2, "a")]) ?</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>[(1, 'z'), (2, 'a'), (2, 'b')]</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>[(2, 'a'), (2, 'b'), (1, 'z')]</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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[(1, 'z'), (2, 'b'), (2, 'a')]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à premier élément égal, la<br/>
comparaison se poursuit sur le<br/>
deuxième, donc 'a' passe avant<br/>
'b'.</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="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="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 append.</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>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>
  <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>
</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 t = (10, 20, 30, 40, 50).<br/>
Que vaut t[1:3] ?</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. t[1:3] 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="0" format="html">
    <text><![CDATA[<p>Le tuple (20, 30, 40), 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le tuple (20, 30)</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 [20, 30], 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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q42 : Retirer une valeur d'une liste</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
l = [3, 1, 4, 1, 5]<br/>
l.remove(1)<br/>
print(l)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux pièges en un : remove 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="0" format="html">
    <text><![CDATA[<p>Il affiche [3, 1, 4, 1, 5], remove renvoyant une nouvelle liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : remove modifie la liste sur<br/>
place et ne renvoie rien.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche [3, 4, 1, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : remove 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 [1, 4, 1, 5], le premier élément étant retiré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : remove 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 [3, 4, 5], 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/>
remove autant de fois qu'il y a de<br/>
valeurs à retirer.</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 notes 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>notes[len(notes) - 1]</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>notes[12], 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>notes[len(notes)], 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 IndexError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>notes.dernier()</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>`<code>python<br/>
carres = []<br/>
for i in range(1, 5):<br/>
    carres.append(i * i)<br/>
print(carres)<br/>
</code>`<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 append 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="0" format="html">
    <text><![CDATA[<p>Il affiche [1, 4, 9, 16, 25]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : range(1, 5) 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 [0, 1, 4, 9, 16]</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 16, seule la dernière valeur étant gardée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append ajoute sans écraser,<br/>
toutes les valeurs restent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche [1, 4, 9, 16]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la liste part vide et<br/>
reçoit un carré à chaque tour, pour i<br/>
valant 1, 2, 3 puis 4.</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 list(range(2, 9, 2)) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>range ne crée pas une liste mais une<br/>
suite d'entiers parcourable ; list 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="0" format="html">
    <text><![CDATA[<p>[0, 2, 4, 6, 8]</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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[2, 4, 6, 8]</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>[2, 3, 4, 5, 6, 7, 8]</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>[2, 4, 6, 8, 10]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 10 dépasse la borne de fin,<br/>
qui est exclue.</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>`<code>python<br/>
l = [4, 7, 2]<br/>
for v in l:<br/>
    print(v)<br/>
for i in range(len(l)):<br/>
    print(l[i])<br/>
</code>`<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/>
l[i], c'est-à-dire la valeur rangée à<br/>
l'indice i.</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 : l[i] désigne un élément, pas<br/>
la liste.</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 : range(len(l)) produit<br/>
exactement les indices valides.</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>`<code>python<br/>
notes = [12, 15, 9]<br/>
total = 0<br/>
for n in notes:<br/>
    total = total + n<br/>
print(total)<br/>
</code>`<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="0" format="html">
    <text><![CDATA[<p>Il affiche 9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 9 est la dernière note, pas<br/>
la somme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche [12, 15, 9]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : total est un nombre, pas une<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche 36</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 12</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le résultat si<br/>
total était réaffecté à chaque tour<br/>
au lieu d'être augmenté.</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>`<code>python<br/>
valeurs = [3, 9, 4]<br/>
m = valeurs[0]<br/>
for v in valeurs:<br/>
    if v &gt; m:<br/>
        m = v<br/>
print(m)<br/>
</code><br/>
Pourquoi initialise-t-on m avec<br/>
valeurs[0]` ?</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="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="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>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>
  <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>
</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 notes = [8, 14, 11, 5].<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/>
append 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="0" format="html">
    <text><![CDATA[<p>[n if n &gt;= 10 for n in notes]</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>[notes if n &gt;= 10], sans boucle explicite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque la boucle for, qui<br/>
parcourt les éléments un à un.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[n &gt;= 10 for n in notes], qui teste chaque note</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette expression construit une<br/>
liste de booléens, [False, True, True,<br/>
False], et non les notes elles-mêmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[n for n in notes if n &gt;= 10]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la condition filtre les<br/>
éléments gardés, ici [14, 11].</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>`<code>python<br/>
grille = [[1, 2, 3], [4, 5, 6]]<br/>
print(grille[1][2])<br/>
</code>`<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="0" format="html">
    <text><![CDATA[<p>Il affiche [4, 5, 6]</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="100" format="html">
    <text><![CDATA[<p>Il affiche 6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : grille[1] désigne la<br/>
deuxième ligne [4, 5, 6], et [2] en<br/>
prend le troisième élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait grille[0][2], sur<br/>
une autre ligne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche 2, 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>`<code>python<br/>
original = [1, 2, 3]<br/>
copie = original[:]<br/>
copie.append(4)<br/>
print(original, copie)<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Retenir la différence : copie = original<br/>
partage la même liste, copie = original[:]<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="0" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3, 4] [1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le cas avec<br/>
copie = original, qui donne deux noms<br/>
à la même liste.</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 : original[:] est une écriture<br/>
courante et valide pour copier une<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3] [1, 2, 3, 4]</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 [1, 2, 3] [4]</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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q52 : Lignes et colonnes d'un tableau</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
t = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]<br/>
</code></p>
<p>Combien de lignes et de colonnes possède le tableau<br/>
t` ?</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. len(t) donne<br/>
le nombre de lignes, len(t[0]) 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="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="100" format="html">
    <text><![CDATA[<p>4 lignes et 3 colonnes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>len(t) vaut 4 (quatre listes intérieures) et<br/>
len(t[0]) vaut 3.</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 : t[0] est<br/>
[0, 1, 2].</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>
</question>

<question type="multichoice">
  <name>
    <text>Tuples et listes — Q53 : Modifier une case d'une grille</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
grille = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]<br/>
grille[2][0] = 0<br/>
print(grille)<br/>
</code>`</p>
<p>Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>grille[i][j] se lit de gauche à droite :<br/>
grille[i] sélectionne la ligne d'indice i, puis<br/>
[j] 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="0" format="html">
    <text><![CDATA[<p>[[1, 2, 0], [4, 5, 6], [7, 8, 9]]</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>[[1, 2, 3], [4, 5, 6], [7, 8, 0]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>[0] désigne le premier élément de la ligne, pas<br/>
le dernier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[[1, 2, 3], [4, 5, 6], [0, 8, 9]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>grille[2] est la troisième ligne, [7, 8, 9],<br/>
et [0] en désigne le premier élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[[0, 2, 3], [4, 5, 6], [7, 8, 9]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce serait grille[0][0] = 0 ; le premier indice<br/>
choisit la ligne, pas la colonne.</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[<p>`<code>python<br/>
t = [[1, 2], [3, 4], [5, 6]]<br/>
total = 0<br/>
for i in range(len(t)):<br/>
    total = total + t[i][1]<br/>
print(total)<br/>
</code>`</p>
<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="0" format="html">
    <text><![CDATA[<p>9</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="100" format="html">
    <text><![CDATA[<p>12</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>t[i][1] 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>21</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>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce serait la dernière valeur lue, pas la somme<br/>
accumulée dans total.</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[<p>`<code>python<br/>
m = [[0 for j in range(3)] for i in range(2)]<br/>
</code></p>
<p>Quelle valeur reçoit m` ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une compréhension dans une compréhension : la partie<br/>
intérieure [0 for j in range(3)] construit une<br/>
ligne, la partie extérieure répète cette<br/>
construction pour chaque i. 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="0" format="html">
    <text><![CDATA[<p>[[0, 1, 2], [0, 1, 2]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'expression produite est 0, pas j ; la<br/>
variable j ne sert qu'à répéter trois fois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[[0, 0], [0, 0], [0, 0]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>range(2) est à l'extérieur : il fixe le nombre<br/>
de lignes à deux, et range(3) le nombre de<br/>
colonnes à trois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[[0, 0, 0], [0, 0, 0]]</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>[0, 0, 0, 0, 0, 0]</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>
</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[<p>`<code>python<br/>
ligne = [0, 0, 0]<br/>
m = [ligne, ligne]<br/>
m[0][0] = 5<br/>
print(m)<br/>
</code>`</p>
<p>Qu'affiche ce programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>[ligne, ligne] ne copie pas ligne : 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/>
[[0 for j in range(3)] for i in range(2)].</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>[[0, 0, 0], [0, 0, 0]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'affectation m[0][0] = 5 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>[[5, 0, 0], [5, 0, 0]]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>m[0] et m[1] désignent la même liste<br/>
ligne ; la modifier par l'une se voit par<br/>
l'autre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>[[5, 0, 0], [0, 0, 0]]</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>
</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 division(a, b) doit renvoyer à la fois le quotient<br/>
et le reste de la division euclidienne de a par b. 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é : return q, r construit le tuple et<br/>
q, r = division(a, b) 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="0" format="html">
    <text><![CDATA[<p>Renvoyer la chaîne "q,r" 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="100" format="html">
    <text><![CDATA[<p>Renvoyer le tuple (q, r), décomposé par q, r = division(a, b)</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>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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Écrire deux instructions return successives, une par valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la première instruction return termine la fonction.<br/>
La seconde ne serait jamais exécutée et le reste serait perdu.</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 reglages[0] = 50 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, 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>
  <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 reglages[0] = 50 dans la fonction<br/>
modifie bien la liste d'origine.</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 L = [10, 20, 30, 40, 50, 60].<br/>
Que vaut L[1:4] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L[a:b] 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 range(a, b).</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 [30, 40, 50], 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/>
20.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [20, 50], 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste [20, 30, 40]</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 [20, 30, 40, 50], les deux bornes étant incluses</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice de fin est toujours<br/>
exclu, comme dans range(1, 4).</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 L = [3, 1, 4, 1, 5, 9].<br/>
Que vaut L[:2] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un début omis vaut 0 : L[:k] 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="0" format="html">
    <text><![CDATA[<p>La liste [4, 1, 5, 9]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est L[2:]. 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="100" format="html">
    <text><![CDATA[<p>La liste [3, 1]</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 [3, 1, 4], 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 [5, 9], les 2 derniers éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les 2 derniers s'écrivent<br/>
L[-2:]. 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 L = [10, 20, 30, 40, 50].<br/>
Que vaut L[2:] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une fin omise vaut len(L) : L[k:]<br/>
donne tout à partir de l'indice k<br/>
inclus. Avec L[:k], 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="0" format="html">
    <text><![CDATA[<p>La liste [30], 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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [40, 50], 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 [10, 20]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est L[:2], les éléments<br/>
placés avant l'indice 2.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste [30, 40, 50]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fin omise vaut<br/>
len(L). On prend tout à partir de<br/>
l'indice 2 inclus.</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 L = [2, 4, 6, 8, 10].<br/>
Que vaut L[-2:] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L[-k:] donne les k derniers éléments,<br/>
L[:-k] 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="0" format="html">
    <text><![CDATA[<p>La liste [2, 4, 6], tout sauf les 2 derniers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est L[:-2], 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 [2, 4], 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 [10, 8], 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste [8, 10], les 2 derniers éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'indice -2 désigne<br/>
le 2e élément en partant de la fin,<br/>
et la fin omise va jusqu'au bout.</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 s = "bonjour".<br/>
Que vaut s[1:-1] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>s[1:-1] 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 'onjou'</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on part de l'indice 1<br/>
(le 'o') 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>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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La chaîne 'onjour'</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>La chaîne 'bonjou'</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'indice 1 désigne le<br/>
deuxième caractère. Le 'b' a l'indice<br/>
0 et n'est pas pris.</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 L = [10, 11, 12, 13, 14, 15, 16].<br/>
Que vaut L[1::2] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L[début:fin:pas] : le pas est l'écart<br/>
entre deux indices pris. L[::2] prend<br/>
les indices pairs, L[1::2] 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="0" format="html">
    <text><![CDATA[<p>La liste [13, 14, 15, 16], 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste [11, 13, 15]</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 [10, 12, 14, 16]</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 [11], 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>
</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 mot = "python".<br/>
Que vaut mot[::-1] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>mot[::-1] 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 'nohtyp'</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 'n', le dernier caractère</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est mot[-1], 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 'pytho', sans le dernier caractère</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est mot[:-1]. 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 'ython', sans le premier caractère</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est mot[1:]. 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>``python<br/>
def est_palindrome(mot):<br/>
    return mot == mot[::-1]</p>
<p>print(est_palindrome("kayak"))<br/>
print(est_palindrome("radis"))<br/>
``<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 : mot == mot[::-1] 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="0" format="html">
    <text><![CDATA[<p>Il affiche False puis False, mot[::-1] 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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche True puis False</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : "kayak" se lit de la<br/>
même façon dans les deux sens, pas<br/>
"radis", qui donne "sidar".</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche True puis True</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : "radis"[::-1] vaut "sidar",<br/>
qui est différent de "radis".</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>`<code>python<br/>
L = ['a', 'b', 'c', 'd']<br/>
x = L[1]<br/>
y = L[1:2]<br/>
</code><br/>
Que valent x et y` ?</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 L[1:2] + 1 si<br/>
L 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="0" format="html">
    <text><![CDATA[<p>x et y valent tous deux ['b']</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>x vaut 'b' et y vaut ['b', 'c']</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>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>x vaut 'b' et y vaut ['b']</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : L[1] est un élément,<br/>
L[1:2] est une liste qui contient cet<br/>
élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>x et y valent tous deux 'b'</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>
</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 L = [1, 2, 3, 4].<br/>
Que vaut L[2:10] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Contrairement à L[i], 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="0" format="html">
    <text><![CDATA[<p>Une erreur IndexError, l'indice 10 n'existant pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seul l'accès à un élément,<br/>
comme L[10], provoque IndexError.<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 [3, 4, None, None, None, None, None, None]</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="100" format="html">
    <text><![CDATA[<p>La liste [3, 4]</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>La liste vide []</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 L = [5, 6, 7, 8, 9].<br/>
Que vaut L[3:1] ?</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 []</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 [8, 7], parcourue à l'envers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faudrait un pas négatif,<br/>
L[3:1:-1], pour aller vers la gauche.</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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [6, 7], les bornes étant remises dans l'ordre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne réordonne pas les<br/>
bornes. [6, 7] est L[1:3].</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>`<code>python<br/>
L = [1, 2, 3, 4]<br/>
T = L[1:3]<br/>
T[0] = 99<br/>
print(L)<br/>
</code>`<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 L[:] 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="0" format="html">
    <text><![CDATA[<p>Il affiche [1, 99, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le cas si T é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 [99, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : T[0] est le premier élément<br/>
de T, et T est de toute façon<br/>
distincte de L.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il affiche [1, 2, 3, 4]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : T est une nouvelle<br/>
liste, [2, 3]. La modifier ne change<br/>
pas L.</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 : T 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>`<code>python<br/>
L = ['a', 'b', 'c', 'd', 'e']<br/>
L[1:3] = ['X', 'Y', 'Z']<br/>
print(L)<br/>
</code>`<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 ['a', 'X', 'Y', 'Z', 'd', 'e']</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les éléments d'indice<br/>
1 et 2 ('b' et 'c') 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 ['a', 'X', 'Y', 'd', 'e'], 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>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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il affiche ['a', 'X', 'Y', 'Z', 'e']</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fin 3 est exclue, 'd'<br/>
n'est pas remplacé.</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>`<code>python<br/>
s = "python"<br/>
s[0:2] = "PY"<br/>
</code>`<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 +.</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 TypeError : 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 : s = "PY" + s[2:].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>s reste 'python', 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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>s devient 'PYpython', "PY" é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>s devient 'PYthon'</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>
</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 L = [1, 2, 3, 4, 5].<br/>
Que vaut L[2:] + L[:2] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L[k:] + L[:k] 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="0" format="html">
    <text><![CDATA[<p>La liste [3, 4, 5]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : + met bout à bout les deux<br/>
tranches, aucun élément n'est perdu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste [1, 2, 3, 4, 5], 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="100" format="html">
    <text><![CDATA[<p>La liste [3, 4, 5, 1, 2]</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 [4, 5, 1, 2, 3]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la rotation dans l'autre<br/>
sens, L[-2:] + L[:-2].</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 T = ('a', 'b', 'c', 'd', 'e').<br/>
Que vaut T[::2] ?</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="0" format="html">
    <text><![CDATA[<p>La liste ['a', 'c', 'e']</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="100" format="html">
    <text><![CDATA[<p>Le tuple ('a', 'c', 'e')</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 T.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tuple ('a', 'b'), 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 T[:2].</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le tuple ('b', 'd')</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont les indices impairs,<br/>
T[1::2]. Sans début, on part de<br/>
l'indice 0.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
