<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Variables et types de base</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Variables Python, affectation, types primitifs (entier,<br/>
flottant, chaîne, booléen), conversions de types,<br/>
opérateurs arithmétiques et logiques, opérations de base<br/>
sur les chaînes.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q01 : Affectation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la signification de l'instruction<br/>
x = 5 en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'opérateur = est l'<strong>affectation</strong> (asymétrique :<br/>
gauche reçoit droite). À ne pas confondre avec<br/>
== qui est le <strong>test d'égalité</strong> (symétrique,<br/>
booléen).</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>Affecter la valeur 5 à la variable x</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on fait pointer le nom x<br/>
vers la valeur 5. Si x n'existait pas,<br/>
la variable est créée ; sinon, elle est mise<br/>
à jour.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tester si x est égal à 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le test d'égalité s'écrit == (deux<br/>
signes égal). Avec un seul =, c'est une<br/>
<strong>affectation</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Définir une fonction x qui renvoie 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une fonction se définit avec def.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Multiplier x par 5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la multiplication s'écrit x * 5.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q02 : Type entier</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le type de la valeur 42 en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Python distingue int (entiers, précision<br/>
arbitraire) et float (flottants, précision<br/>
finie). 42 et 42.0 sont distincts (mais<br/>
égaux par valeur).</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>int</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 42 est un <strong>entier</strong> (type<br/>
int). On peut le vérifier avec<br/>
type(42) qui renvoie &lt;class 'int'&gt;.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>str</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 42 n'a pas de guillemets, ce n'est<br/>
pas une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>bool</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les booléens sont True et False.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>float</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 42.0 serait un flottant. Sans<br/>
virgule, c'est un entier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q03 : Type flottant</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie type(3.14) en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Attention : les flottants ont une <strong>précision<br/>
limitée</strong>. 0.1 + 0.2 ne donne pas exactement<br/>
0.3 mais 0.30000000000000004 à cause de la<br/>
représentation binaire IEEE 754.</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>&lt;class 'int'&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 3.14 a une partie décimale, c'est<br/>
un flottant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;class 'decimal'&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : decimal est un module spécialisé,<br/>
mais le type natif des nombres à virgule est<br/>
float.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>&lt;class 'float'&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tout nombre avec un point<br/>
décimal est un flottant en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>&lt;class 'str'&gt;</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de guillemets.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q04 : Type chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le type de "hello" en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Python n'a pas de type spécifique pour un seul<br/>
caractère : 'a' est une chaîne de longueur 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="100" format="html">
    <text><![CDATA[<p>str</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les chaînes de caractères<br/>
sont du type str (string). On les écrit<br/>
entre guillemets simples (') ou doubles<br/>
(").</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>int</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : "hello" est entre guillemets,<br/>
c'est une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>bool</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un booléen est True ou False.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>char</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de type char en Python (à la<br/>
différence de C ou Java). Un caractère est<br/>
juste une chaîne de longueur 1.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q05 : Type booléen</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelles sont les <strong>deux seules</strong> valeurs du type<br/>
bool en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mnémonique : majuscule à True et False,<br/>
pas comme en JavaScript ou C.</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>True et False</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : avec une <strong>majuscule<br/>
obligatoire</strong>. true ou false (en<br/>
minuscules) provoqueraient une erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>oui et non</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python est en anglais, pas en<br/>
français.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>yes et no</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces mots-clés n'existent pas en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 et 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont des entiers. Ils sont<br/>
interprétés comme booléens (0 = faux, 1 =<br/>
vrai) mais leur type reste int.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q06 : Conversion en entier</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie int("42") ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>int(x) accepte : entiers (renvoie x), flottants<br/>
(tronque vers 0), chaînes représentant un entier.<br/>
Avec int("3.14"), ça lève ValueError.</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 "42"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : int(...) renvoie un entier, pas<br/>
une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'entier 42</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : int(s) convertit la chaîne<br/>
s en son entier correspondant. Utile pour<br/>
lire une saisie utilisateur (input()<br/>
renvoie toujours une chaîne).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : "42" est convertible. Une chaîne<br/>
comme "abc" lèverait ValueError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le flottant 42.0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : int produit un entier, pas un<br/>
flottant. Utiliser float("42") pour cela.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q07 : Opérateur de division</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie 7 / 2 en Python 3 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinction Python 3 : / = division flottante<br/>
(toujours float) ; // = division entière<br/>
(entier si les deux opérandes sont entiers).</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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la division entière (//).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'arrondi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3.5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : en Python 3, / est la<br/>
division <strong>flottante</strong>. Toujours, même entre<br/>
deux entiers.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q08 : Division entière</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie 7 // 2 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avec des <strong>négatifs</strong>, attention : -7 // 2<br/>
vaut -4 (arrondi vers le bas, pas vers 0).<br/>
Cohérent avec a == (a // b) * b + 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>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 0 est le reste, pas le quotient.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'arrondi à l'entier supérieur,<br/>
mais troncature vers le bas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3.5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la division <strong>flottante</strong><br/>
(/).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : // est la division<br/>
<strong>entière</strong> (quotient sans le reste).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q09 : Modulo</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie 7 % 2 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Très utile : n % 2 permet de tester la parité<br/>
(n % 2 == 0 ⇔ pair). De manière plus<br/>
générale, n % k regarde la classe modulo k.</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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : % calcule le <strong>reste</strong><br/>
de la division entière. 7 = 3 × 2 + 1, donc<br/>
7 % 2 = 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3.5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est /, pas %.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 7 est impair, son reste modulo 2<br/>
est 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 3 est le quotient (//), pas le<br/>
reste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q10 : Print</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait l'instruction print("bonjour") ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>print est utile pour le <strong>débogage</strong> rapide.<br/>
Pour des programmes plus structurés, on<br/>
privilégie le module logging.</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>Définit une variable nommée bonjour</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : print affiche, ne définit pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ne fait rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : print produit un effet visible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche bonjour dans la console</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'affichage standard.<br/>
Pour ajouter à la fin, utiliser<br/>
print(x, end="") ; pour séparer plusieurs<br/>
arguments, print(a, b, sep=", ").</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Imprime sur l'imprimante de l'ordinateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Confusion : print affiche dans la<br/>
<strong>console</strong> (sortie standard), pas sur une<br/>
imprimante physique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q11 : Typage dynamique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
x = 5<br/>
x = "hello"<br/>
</code>`<br/>
Cette suite d'instructions est-elle valide ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avec le typage dynamique, on gagne en<br/>
flexibilité mais on perd en sécurité. Les<br/>
annotations de type (x: int = 5) et mypy<br/>
permettent une vérification statique<br/>
optionnelle.</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>Non, il faut redéclarer x</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune « redéclaration » nécessaire<br/>
en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais Python affiche un avertissement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun avertissement par défaut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, x est figé en entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le cas dans un langage à<br/>
<strong>typage statique</strong> (Java, C++, Rust),<br/>
mais pas en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, parce que Python est typé dynamiquement : une variable peut changer de type au cours du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python autorise cette<br/>
réaffectation. Attention : c'est puissant<br/>
mais peut causer des bugs subtils.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q12 : Conversion qui plante</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que se passe-t-il avec int("abc") ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : protéger les conversions de<br/>
saisies utilisateur avec un try/except.<br/>
`<code>python<br/>
try:<br/>
    n = int(input())<br/>
except ValueError:<br/>
    print("Pas un entier")<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>Renvoie 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne renvoie pas une valeur<br/>
par défaut, il lève une exception.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie None</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de retour silencieux à None.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie "abc"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : int(...) est censé renvoyer un<br/>
entier, pas une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Lève ValueError</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python lève ValueError:<br/>
invalid literal for int() with base 10:<br/>
'abc'. À gérer avec un try/except.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q13 : Concaténation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie "abc" + "def" ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>+ est <strong>surchargé</strong> : addition pour les<br/>
nombres, concaténation pour les chaînes et<br/>
les listes. Mais pas de mélange : "a" + 5<br/>
lève TypeError.</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>abc def</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun espace n'est ajouté<br/>
automatiquement par +.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>9 (somme alphabétique)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune somme alphabétique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>abcdef</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : + concatène deux chaînes.<br/>
Le résultat est "abcdef" (sans espace,<br/>
sauf indication explicite).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q14 : Répétition de chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie "ab" * 3 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Comme pour +, <em> est surchargé. Sur des<br/>
listes : [0] </em> 5 == [0, 0, 0, 0, 0]. Très<br/>
utile pour initialiser un tableau.</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>ababab</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <em> répète une chaîne. C'est<br/>
un raccourci très pratique :<br/>
"-" </em> 80 produit une ligne de tirets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>6 (longueur)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : * ne calcule pas la longueur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>ab3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : * ne convertit pas l'entier en<br/>
chaîne pour concaténer.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q15 : Saisie utilisateur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie input("Âge ?") après que<br/>
l'utilisateur a tapé 17 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Piège classique : n = input(); n + 1 lève<br/>
TypeError car n est une chaîne. Penser à<br/>
convertir explicitement.</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 flottant 17.0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de conversion automatique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le booléen True</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction input() renvoie<br/>
systématiquement une chaîne<br/>
de caractères, indépendamment<br/>
de ce que l'utilisateur saisit.<br/>
Aucune conversion en booléen<br/>
n'est effectuée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'entier 17</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : input renvoie <strong>toujours</strong> une<br/>
chaîne, même si l'utilisateur a tapé un<br/>
nombre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La chaîne "17"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour obtenir un entier, il<br/>
faut convertir : int(input("Âge ?")).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q16 : Comparaison</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie 2 &lt; 3 &lt; 5 en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Particularité Python (rare dans les autres<br/>
langages) : a &lt; b &lt; c est correctement<br/>
interprété comme a &lt; b and b &lt; c.</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>False</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 2 &lt; 3 et 3 &lt; 5 sont les deux<br/>
vraies.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la comparaison renvoie un booléen,<br/>
pas une valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur de syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python autorise la comparaison<br/>
chaînée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>True (équivalent à 2 &lt; 3 and 3 &lt; 5)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python permet d'enchaîner<br/>
les comparaisons. C'est lisible et naturel<br/>
(« 3 est entre 2 et 5 »).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q17 : Conversion en booléen</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie bool(0) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Valeurs <strong>fausses</strong> en Python : False, 0,<br/>
0.0, "", [], {}, None. Tout le reste<br/>
est vrai. Permet d'écrire if liste: au lieu<br/>
de if len(liste) &gt; 0:.</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>True</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 0 est considéré comme faux en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : bool(...) renvoie un booléen,<br/>
pas le même entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>False</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par convention, 0 (entier<br/>
ou flottant) est faux ; tout autre nombre<br/>
est vrai. La chaîne vide "" et la liste<br/>
vide [] sont aussi fausses.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : conversion valide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q18 : Longueur de chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie len("hello") ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>len est polymorphe : marche sur les chaînes,<br/>
listes, tuples, dictionnaires, ensembles,<br/>
fichiers... Toujours en O(1) pour ces types.</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>hello</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : len renvoie un entier, pas la<br/>
chaîne elle-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : len ne renvoie pas le nombre de<br/>
mots ou de phrases.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>5.0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : len renvoie un entier, pas un<br/>
flottant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : len renvoie le nombre<br/>
de caractères. Pour une liste, c'est le<br/>
nombre d'éléments.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q19 : Conversion float → int</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie int(3.9) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinguer quatre fonctions : int(3.9) = 3<br/>
(troncature vers zéro) ; round(3.9) = 4<br/>
(arrondi au plus proche, avec départage au<br/>
pair seulement pour les valeurs à mi-chemin<br/>
du type 0{,}5) ; math.floor(3.9) = 3<br/>
(partie entière inférieure) ;<br/>
math.ceil(3.9) = 4 (partie entière<br/>
supérieure).</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>4 (arrondi)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : int() ne fait pas d'arrondi<br/>
mathématique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : conversion valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3 (troncature vers 0)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : int(x) applique une<br/>
troncature vers 0. int(-3.9) donnerait<br/>
-3, pas -4. Pour arrondir<br/>
mathématiquement, utiliser round.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3.9</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : int() renvoie un entier, pas un<br/>
flottant.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q20 : Indexation de chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie "hello"[0] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Indexation négative : "hello"[-1] = 'o'<br/>
(dernier). Tranche : "hello"[1:4] = 'ell'.</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>h</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python indexe à partir de<br/>
<strong>0</strong>. Le premier caractère est à l'indice<br/>
0, le dernier à l'indice n-1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>e</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à l'indice 1, pas 0.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>hello</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : [0] extrait un seul caractère,<br/>
pas la chaîne entière.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q21 : Précision flottante</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie 0.1 + 0.2 == 0.3 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : ne jamais comparer des<br/>
flottants avec ==. Utiliser<br/>
abs(a - b) &lt; epsilon pour une comparaison à<br/>
ε près, ou le module math.isclose.</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.3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une comparaison renvoie toujours<br/>
un booléen.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>True</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à cause de la représentation IEEE<br/>
754, 0.1 + 0.2 ne donne pas exactement<br/>
0.3.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'erreur, juste un résultat<br/>
contre-intuitif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>False</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 0.1 + 0.2 vaut en réalité<br/>
0.30000000000000004. C'est un piège<br/>
classique des flottants.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q22 : Opérateur puissance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut 2 ** 10 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Syntaxe a <strong> b (parfois écrite pow(a, b)).<br/>
Astuce : 2 </strong> 0.5 donne la racine carrée de<br/>
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>100</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait 10², pas 2¹⁰.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>1024 (= 2¹⁰)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ** est l'opérateur<br/>
puissance. À retenir : 2¹⁰ = 1024,<br/>
2²⁰ ≈ 10⁶, 2³⁰ ≈ 10⁹.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ** est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>20</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion entre <em> (multiplication)<br/>
et </em>* (puissance).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q23 : Affectation simultanée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>`<code>python<br/>
a, b = 1, 2<br/>
a, b = b, a<br/>
</code><br/>
Que valent a et b` à la fin ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'affectation simultanée est l'un des grands<br/>
atouts de Python pour la lisibilité. Beaucoup<br/>
d'algorithmes (tri, recherche) en bénéficient.</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>a = 2, b = 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le résultat <strong>buggé</strong><br/>
d'un échange séquentiel mal écrit. Python<br/>
gère correctement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a = 1, b = 2 (inchangé)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il y a bien échange.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>a = 2, b = 1 (échangés)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python crée d'abord le<br/>
tuple (b, a) = (2, 1), puis le déballe<br/>
dans a, b. Les deux changent<br/>
<strong>simultanément</strong>, sans variable<br/>
temporaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q24 : Print avec virgule</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie print("a", "b", "c") ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Paramètres utiles : sep="..." (séparateur<br/>
entre arguments) et end="..." (à la fin, par<br/>
défaut \n). Pour ne pas aller à la ligne :<br/>
print("...", end="").</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>Affiche [a, b, c]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun crochet ajouté<br/>
automatiquement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche abc</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : par défaut, print insère un<br/>
espace entre les arguments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche a b c (espaces entre les arguments)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le séparateur par défaut<br/>
est un espace. On peut le changer avec<br/>
sep="...". Ex. : print("a", "b",<br/>
sep=" - ") affiche a - b.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Lève une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : print accepte plusieurs<br/>
arguments.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes, laquelle est<br/>
<strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mnémonique des valeurs fausses : « tout ce<br/>
qui est vide ou nul ». Cela permet des<br/>
idiomes concis comme if liste: (= « si la<br/>
liste n'est pas 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>Python est typé dynamiquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : une variable peut changer de type.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La chaîne vide "" est considérée comme vraie dans une condition</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : la chaîne vide<br/>
est <strong>fausse</strong> en contexte booléen, comme<br/>
0, [], {}, None.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>/ produit toujours un flottant en Python 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : différence par rapport à Python 2.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les indices Python commencent à 0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : convention standard en informatique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q26 : Échanger deux variables en Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la façon la plus idiomatique d'échanger<br/>
les valeurs de deux variables a et b en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'affectation multiple a, b = b, a repose sur les<br/>
<em>p-uplets</em> implicites : Python crée d'abord le<br/>
couple (b, a) côté droit, puis le déballe à<br/>
gauche. Cette construction est plus claire et plus<br/>
courte que la version classique avec variable<br/>
temporaire (tmp = a; a = b; b = tmp).</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>swap(a, b)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'existe pas de fonction native<br/>
swap en Python. De plus, comme les paramètres<br/>
sont passés par référence d'objet, une telle<br/>
fonction ne pourrait pas réaffecter les<br/>
variables d'origine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a = b = a</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette instruction affecte la valeur<br/>
actuelle de a à b, puis cette même valeur à<br/>
a (sans changement). Aucun échange n'est<br/>
effectué.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>a = b puis b = a</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce code ne réalise pas un échange. Après<br/>
la première instruction, a perd sa valeur<br/>
d'origine et prend celle de b. La seconde<br/>
instruction recopie alors b dans... b. Les<br/>
deux variables se retrouvent égales à la valeur<br/>
initiale de b.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>a, b = b, a</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python évalue d'abord le<br/>
membre de droite (le couple (b, a)) puis<br/>
affecte simultanément les deux composantes aux<br/>
variables de gauche. Aucune variable temporaire<br/>
n'est nécessaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q27 : Affichage formaté avec une f-string</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On exécute le code suivant :</p>
<p>`<code>python<br/>
prix = 12.5<br/>
quantite = 3<br/>
print(f"Total : {prix * quantite} €")<br/>
</code>`</p>
<p>Que va afficher le programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques options pratiques des f-strings :<br/>
f"{x:.2f}" arrondit à deux chiffres après la<br/>
virgule, f"{x:&gt;10}" aligne à droite sur dix<br/>
caractères, f"{x=}" affiche à la fois le nom et<br/>
la valeur (x=37.5). C'est une syntaxe à privilégier<br/>
pour la plupart des affichages courants.</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>Total : 37.5 €</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la f-string remplace<br/>
{prix * quantite} par le résultat de<br/>
l'expression évaluée, soit<br/>
12{,}5 \times 3 = 37{,}5. Le reste de la<br/>
chaîne est laissé tel quel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Total : 12.5 * 3 €</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python évalue toujours l'expression<br/>
entre accolades, il n'affiche jamais l'opération<br/>
en clair. Le résultat affiché est<br/>
37{,}5, pas la formule.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Total : {prix * quantite} €</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la lettre f placée devant la chaîne<br/>
active le formatage : les expressions entre<br/>
accolades sont <strong>évaluées</strong> avant l'affichage.<br/>
Sans le préfixe f, on aurait au contraire ce<br/>
rendu littéral.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code provoque une erreur de syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est correcte. Les f-strings<br/>
sont disponibles depuis Python 3{.}6 et sont<br/>
aujourd'hui le moyen le plus simple d'insérer<br/>
des valeurs dans une chaîne.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q28 : Méthodes de chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que vaut l'expression "NSI".lower() en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthodes de chaîne fréquentes : upper() (tout en<br/>
majuscules), lower() (tout en minuscules),<br/>
strip() (supprime les espaces de début et de fin),<br/>
replace(a, b) (remplace a par b),<br/>
split(sep) (découpe selon un séparateur). Comme<br/>
les chaînes sont immuables, ces méthodes renvoient<br/>
toujours une <strong>nouvelle</strong> chaîne.</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>'Nsi'</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait l'effet de la méthode<br/>
capitalize, qui met seulement la première<br/>
lettre en majuscule et les autres en minuscules.<br/>
La méthode lower agit sur tous les caractères.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La méthode lower n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : lower est une méthode standard des<br/>
chaînes Python, présente depuis les premières<br/>
versions du langage. Elle est très utilisée pour<br/>
comparer des chaînes sans tenir compte de la<br/>
casse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>'nsi'</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : lower renvoie une <strong>nouvelle<br/>
chaîne</strong> où toutes les lettres ont été passées<br/>
en minuscules. La chaîne d'origine n'est pas<br/>
modifiée (les chaînes Python sont immuables).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>'NSI'</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode lower transforme la chaîne<br/>
en minuscules. Elle ne peut donc pas renvoyer la<br/>
chaîne d'origine inchangée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Variables et types de base — Q29 : Différence entre `==` et `is`</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, quelle est la différence entre les<br/>
opérateurs == et is ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Recommandation pratique : utiliser == pour<br/>
comparer des valeurs ordinaires, et réserver is<br/>
aux comparaisons à des <strong>singletons</strong> (x is None,<br/>
x is True, x is False). La référence avec<br/>
None est en effet unique en mémoire, donc is<br/>
est exact et plus rapide.</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>== renvoie un nombre, is renvoie un booléen</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux opérateurs renvoient un<br/>
booléen (True ou False). Aucun ne produit<br/>
de valeur numérique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux sont strictement équivalents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils ne testent pas la même chose. La<br/>
confusion entre les deux est une source classique<br/>
de bugs subtils, en particulier sur les listes<br/>
et les dictionnaires.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>== ne fonctionne que sur les nombres ; is ne fonctionne que sur les chaînes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux opérateurs s'appliquent à<br/>
<strong>toutes</strong> les valeurs Python. La distinction<br/>
entre eux est sémantique (égalité de valeur vs<br/>
identité d'objet), pas typologique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>== compare les valeurs ; is teste si les deux références désignent le même objet en mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : deux listes peuvent contenir les<br/>
mêmes valeurs ([1, 2] == [1, 2] vaut True)<br/>
tout en étant des objets distincts en mémoire<br/>
([1, 2] is [1, 2] vaut False). L'opérateur<br/>
is est plus strict que ==.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
