<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Modules Python</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Notion de module, importation (<code>import</code>,<br/>
<code>from ... import</code>), modules standards (<code>math</code>,<br/>
<code>random</code>, <code>os</code>, <code>csv</code>...), création de ses propres<br/>
modules, espaces de noms, alias.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q01 : Qu'est-ce qu'un module ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, qu'est-ce qu'un <strong>module</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La modularité est un principe central en génie<br/>
logiciel : organiser le code en unités<br/>
cohérentes et réutilisables, plutôt qu'un seul<br/>
gros fichier.</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 type de données spécialisé dans les calculs mathématiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un module est un fichier, pas un<br/>
type de données ; et il peut contenir du<br/>
code de toute nature, pas seulement du<br/>
calcul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un fichier <code>.py</code> regroupant du code réutilisable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un module rassemble des<br/>
fonctions ou constantes réutilisables. On<br/>
peut l'importer dans un autre programme<br/>
pour utiliser ses fonctions sans les<br/>
recoder.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une boucle imbriquée exécutée à l'intérieur d'une fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une boucle imbriquée est<br/>
une construction de<br/>
contrôle interne à une<br/>
fonction. Un module est<br/>
au contraire une unité<br/>
d'organisation du code,<br/>
stockée dans un fichier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une variable globale accessible dans tout le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une variable globale est<br/>
une variable accessible<br/>
dans tout un programme.<br/>
Un module, lui, est une<br/>
unité d'organisation du<br/>
code, contenue dans un<br/>
fichier source distinct.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q02 : Import</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment <strong>importer</strong> le module <code>math</code> en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>import math</code> charge le module et le rend<br/>
accessible sous le nom <code>math</code>. Pour des<br/>
fonctions précises sans préfixe :<br/>
<code>from math import sqrt</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>require math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la syntaxe JavaScript / Ruby.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>use math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la syntaxe Perl.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>include math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la syntaxe C/C++.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>import math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'instruction <code>import</code> rend<br/>
accessible le contenu du module via le<br/>
préfixe <code>math.</code> (ex. <code>math.sqrt(2)</code>).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q03 : Utilisation après import</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Après <code>import math</code>, comment appelle-t-on la<br/>
fonction <code>sqrt</code> (racine carrée) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Préfixe = <strong>espace de noms</strong>. Évite les<br/>
conflits si plusieurs modules ont des<br/>
fonctions de même nom.</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>math-&gt;sqrt(2)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>-&gt;</code> est la syntaxe Perl/PHP.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>math.sqrt(2)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on utilise le préfixe<br/>
<code>module.fonction</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>sqrt(2)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans préfixe <code>math.</code>, Python ne<br/>
connaît pas <code>sqrt</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math::sqrt(2)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>::</code> est la syntaxe C++ ou Ruby.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q04 : from import</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait <code>from math import sqrt</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes : <code>from math import sqrt, pi</code> (deux<br/>
noms) ou <code>from math import *</code> (tout, mais à<br/>
éviter, pollue l'espace de noms).</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>Importe l'intégralité du module <code>math</code> dans le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on importe seulement <code>sqrt</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Importe seulement <code>sqrt</code>, appelable directement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on écrit alors <code>sqrt(2)</code><br/>
sans préfixe. Utile quand on n'a besoin<br/>
que de quelques fonctions et qu'on veut<br/>
éviter le préfixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Provoque une erreur, <code>sqrt</code> devant rester préfixé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est parfaitement<br/>
valide ; c'est même elle qui permet de se<br/>
passer du préfixe <code>math.</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renomme le module <code>math</code> en <code>sqrt</code> pour la suite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le renommage à<br/>
l'importation utilise<br/>
le mot-clé <code>as</code>, par<br/>
exemple <code>import math as<br/>
m</code>. La syntaxe <code>from ...<br/>
import</code> ne renomme rien,<br/>
elle expose un symbole<br/>
précis.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q05 : Constante pi</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment obtenir la valeur de π en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Constantes utiles dans <code>math</code> : <code>math.pi</code>,<br/>
<code>math.e</code>, <code>math.inf</code>, <code>math.nan</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math.PI</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python distingue majuscules et<br/>
minuscules ; <code>math.PI</code> n'existe pas<br/>
(<code>AttributeError</code>). La constante s'écrit<br/>
<code>math.pi</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>math.pi</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : après <code>import math</code>,<br/>
<code>math.pi</code> vaut environ 3.141592653589793,<br/>
la meilleure approximation flottante<br/>
disponible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>Math.pi</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>Math</code> avec une majuscule est<br/>
l'objet de JavaScript ; en Python le module<br/>
s'appelle <code>math</code> (<code>NameError</code> sinon).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math.pi()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>math.pi</code> est une constante (un<br/>
flottant), pas une fonction : les<br/>
parenthèses provoquent <code>TypeError</code><br/>
(« 'float' object is not callable »).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q06 : Module random</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel module de la bibliothèque standard permet<br/>
de générer des nombres aléatoires ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>random</code> est très utilisé en NSI Première<br/>
pour les jeux, les simulations, le tirage<br/>
aléatoire.</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>time</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>time</code> sert à mesurer ou à attendre une durée,<br/>
par exemple avec <code>time.time()</code>, pas à tirer des<br/>
nombres au hasard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>math</code> est pour les fonctions<br/>
mathématiques classiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>random</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>random.randint(a, b)</code>,<br/>
<code>random.choice(liste)</code>, <code>random.shuffle(...)</code>,<br/>
etc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>stochastic</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de module standard de ce nom.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q07 : Tirage aléatoire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait <code>random.randint(1, 6)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinction subtile : <code>random.randint(a, b)</code><br/>
→ bornes <strong>incluses</strong> ; <code>random.randrange(a,<br/>
b)</code> → b <strong>exclue</strong> (comme <code>range</code>).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie 6 (le maximum)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est aléatoire, pas<br/>
systématiquement le max.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie une liste de 6 éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie un nombre flottant entre 1 et 6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>randint</code> renvoie un <strong>entier</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Renvoie un entier aléatoire entre 1 et 6, inclus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : simule un dé à 6 faces.<br/>
Attention : contrairement à <code>range</code>, les<br/>
deux bornes sont <strong>incluses</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q08 : Alias avec as</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que fait <code>import math as m</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'alias ne change rien au contenu du module : il<br/>
raccourcit seulement le préfixe à écrire devant<br/>
chaque fonction, ce qui allège le code quand le<br/>
module est utilisé souvent.</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>Importe deux modules, <code>math</code> et <code>m</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul module est chargé ; <code>m</code> n'est<br/>
qu'un second nom pour le désigner.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Importe <code>math</code> mais le rend accessible sous le nom <code>m</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>as m</code> crée un <strong>alias</strong>. On<br/>
écrit ensuite <code>m.sqrt(2)</code> ; le nom <code>math</code> seul<br/>
n'est pas défini et <code>math.sqrt(2)</code> lève<br/>
<code>NameError</code>. Pratique pour raccourcir un nom<br/>
de module long.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Provoque une erreur de syntaxe à cause du mot <code>as</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe <code>import x as y</code> est<br/>
valide et courante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Importe seulement la fonction <code>m</code> du module <code>math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est tout <code>math</code> qui est importé,<br/>
simplement accessible via <code>m</code>. Importer un<br/>
seul nom s'écrit <code>from math import sqrt</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q09 : Bibliothèque standard</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie « bibliothèque standard de Python » ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un module de la bibliothèque standard, comme<br/>
<code>math</code> ou <code>random</code>, s'importe sans aucune<br/>
installation préalable : il suffit d'écrire<br/>
<code>import math</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 norme ISO obligatoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de normalisation officielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La documentation de référence officielle du langage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Confusion : la bibliothèque standard est un<br/>
<strong>ensemble de modules</strong>, pas la doc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les modules livrés avec Python, sans installation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>math</code>, <code>random</code>, <code>csv</code> ou<br/>
<code>time</code> sont prêts à l'emploi, sans rien<br/>
installer. C'est l'une des grandes forces<br/>
de Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les modules que l'on écrit soi-même pour son projet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un fichier <code>.py</code> écrit pour son projet<br/>
est bien un module, mais il ne fait pas partie<br/>
de la bibliothèque standard, qui regroupe les<br/>
modules fournis avec Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q10 : Exemple complet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>import math
print(math.sqrt(16))</code></pre><br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour un entier, utiliser <code>int(math.sqrt(16))</code><br/>
ou <code>math.isqrt(16)</code> (entier directement, sans<br/>
passer par un flottant).</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 <code>16.0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>sqrt</code> calcule la <strong>racine</strong>, pas<br/>
l'identité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche <code>4.0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>math.sqrt(16)</code> = 4.0<br/>
(flottant, même pour un carré parfait).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Lève une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : code valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Affiche <code>4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas tout à fait : <code>sqrt</code> renvoie un<br/>
<strong>flottant</strong> (<code>4.0</code>), pas un entier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q11 : Espace de noms</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi est-il <strong>déconseillé</strong> d'utiliser<br/>
<code>from math import *</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : <code>import math</code> (préfixe) ou<br/>
<code>from math import sqrt, pi</code> (sélectif).<br/>
Éviter <code>from x import *</code> sauf pour des<br/>
modules conçus pour cela.</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 que ce mode d'importation est nettement trop lent à l'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : performance équivalente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que les noms importés peuvent masquer des fonctions existantes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tous les noms du module<br/>
sont importés d'un coup (collisions<br/>
possibles). Par exemple, si vous aviez une<br/>
variable <code>pow</code>, elle serait écrasée par<br/>
<code>math.pow</code>. Source de bugs subtils.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que cette syntaxe est interdite depuis Python 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe reste parfaitement<br/>
autorisée, elle est seulement déconseillée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que seule la première fonction du module est importée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est tout l'inverse, l'étoile<br/>
importe <strong>tous</strong> les noms publics du<br/>
module d'un seul coup.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q12 : Créer son module</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment créer son propre module<br/>
<code>mes_outils.py</code> et l'importer ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette simplicité est l'un des grands atouts<br/>
de Python pour la modularité. Un projet est<br/>
naturellement organisé en plusieurs fichiers<br/>
<code>.py</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut placer un mot-clé <code>module</code> au début du fichier source</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun mot-clé spécial n'est<br/>
nécessaire, tout fichier <code>.py</code> est<br/>
d'office un module.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut compiler <code>mes_outils.py</code> avant de pouvoir l'importer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python est interprété, aucune<br/>
compilation explicite n'est demandée au<br/>
programmeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Écrire le fichier, puis faire <code>import mes_outils</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tout fichier <code>.py</code> est un<br/>
module. On crée <code>mes_outils.py</code> avec ses<br/>
fonctions, et <code>import mes_outils</code> suffit.<br/>
Aucune déclaration spéciale n'est<br/>
nécessaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut placer le fichier dans le dossier d'installation de Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un module placé dans le même dossier<br/>
que le programme qui l'importe est trouvé<br/>
directement ; aucun déplacement n'est<br/>
nécessaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q13 : Lire la documentation de uniform</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La documentation du module <code>random</code> indique :<br/>
« <code>random.uniform(a, b)</code> renvoie un nombre flottant choisi au<br/>
hasard entre <code>a</code> et <code>b</code>, bornes comprises. »<br/>
Après <code>import random</code>, quelle expression simule une température<br/>
à virgule comprise entre $18$ et $25$ degrés ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Lire la documentation suffit à choisir la bonne fonction :<br/>
<code>uniform(a, b)</code> pour un flottant entre deux bornes,<br/>
<code>randint(a, b)</code> pour un entier, <code>random()</code> sans argument<br/>
pour un flottant entre $0$ et $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><code>random.uniform(18, 25)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : d'après la documentation,<br/>
<code>uniform(18, 25)</code> renvoie un flottant compris<br/>
entre $18$ et $25$, par exemple <code>21.73</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.randint(18, 25)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>randint</code> ne renvoie que des entiers<br/>
($18$, $19$, …, $25$). La température n'aurait<br/>
jamais de partie décimale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.random(18, 25)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>random.random()</code> ne prend aucun<br/>
argument et renvoie un flottant entre $0$ et $1$.<br/>
Cet appel lève <code>TypeError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>18 + random.random() * 25</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>random.random() * 25</code> est compris entre<br/>
$0$ et $25$, donc le résultat va de $18$ à $43$.<br/>
Il faudrait multiplier par $25 - 18 = 7$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q14 : Choix aléatoire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction du module <code>random</code> permet de<br/>
choisir un élément au hasard dans une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Autres fonctions utiles : <code>random.choices</code><br/>
(avec poids), <code>random.sample</code> (sans<br/>
remise), <code>random.shuffle</code> (mélange en place).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.select(liste)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de fonction de ce nom.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.random(liste)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>random.random()</code> renvoie un<br/>
flottant entre 0 et 1, sans paramètre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>random.choice(liste)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>choice</code> renvoie un<br/>
élément aléatoire de la liste (chaque<br/>
élément a la même probabilité d'être<br/>
choisi).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.pick(liste)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction n'a pas ce nom.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q15 : Réutiliser la fonction d'un camarade</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour son projet, Lina veut utiliser la fonction <code>moyenne</code> du<br/>
module <code>stats.py</code> écrit par un camarade, sans lire son code.<br/>
Que lui faut-il connaître pour l'appeler correctement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un module sert à réutiliser du code. Pour appeler une de ses<br/>
fonctions, il suffit de connaître sa spécification : nom,<br/>
paramètres, préconditions éventuelles et valeur renvoyée.<br/>
C'est ce que doit fournir sa documentation.</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>Sa spécification : ses paramètres et ce qu'elle renvoie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le nom de la fonction, ses paramètres<br/>
(avec leurs éventuelles préconditions) et la valeur<br/>
renvoyée suffisent. C'est l'intérêt d'un module bien<br/>
documenté : on le réutilise sans en lire le code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nom des variables utilisées dans le corps de la fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces variables sont internes à la fonction.<br/>
Lina n'en a pas besoin, et le camarade peut les<br/>
renommer sans rien changer pour elle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nom du dossier où le camarade a écrit le module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce qui compte, c'est que <code>stats.py</code> soit<br/>
dans le dossier du programme de Lina au moment de<br/>
l'import, pas l'endroit où il a été écrit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien : <code>import stats</code> affiche la liste des paramètres attendus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>import stats</code> charge le module sans rien<br/>
afficher sur ses fonctions. C'est leur documentation<br/>
qui indique comment les appeler.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q16 : Documentation interactive</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment obtenir l'aide d'une fonction d'un<br/>
module en mode interactif ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>help(math.sqrt)</code> fonctionne après<br/>
<code>import math</code>. Pour une lecture plus<br/>
complète, la documentation officielle<br/>
(docs.python.org) décrit chaque module.</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>help(math.sqrt)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fonction native <code>help</code><br/>
affiche la documentation de la fonction<br/>
reçue en argument. Très utile pour<br/>
découvrir un module.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>man math.sqrt</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>man</code> est une commande Unix.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>info(math.sqrt)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de fonction <code>info</code> en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math.sqrt.help()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>help</code> n'est pas rangée dans la<br/>
fonction <code>sqrt</code> ; c'est une fonction native<br/>
qui reçoit en argument la fonction à<br/>
documenter. Cet appel lève <code>AttributeError</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q17 : Importation sélective</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code utilise <code>pi</code> correctement après<br/>
<code>from math import pi</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>import math</code> → <code>math.pi</code> ; <code>from math import<br/>
pi</code> → <code>pi</code>. Choisir selon ses préférences.</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>math.pi</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec <code>from ... import</code>, on<br/>
n'utilise <strong>pas</strong> le préfixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>pi</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>pi</code> est importé<br/>
directement dans l'espace de noms local.<br/>
On peut écrire <code>2 * pi</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>import.pi</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe invalide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>from.pi</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe invalide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q18 : Conflit de noms</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>from math import sqrt

def sqrt(x):
    return x ** 0.5

print(sqrt(16))</code></pre><br/>
Quelle fonction est appelée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : éviter de redéfinir des<br/>
noms importés. Si on doit le faire, l'import<br/>
avec préfixe (<code>import math</code>) protège.</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 <code>sqrt</code> importée du module <code>math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la définition locale, postérieure<br/>
à l'import, <strong>écrase</strong> le nom importé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux fonctions <code>sqrt</code>, appelées l'une après l'autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un nom ne désigne qu'une seule<br/>
fonction à la fois ; un seul appel a lieu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La fonction <code>sqrt</code> définie localement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la dernière définition<br/>
gagne, et le programme affiche <code>4.0</code>. Les<br/>
deux fonctions calculent ici la même chose<br/>
(la racine carrée), donc le résultat est<br/>
identique, mais en général c'est un piège :<br/>
la définition locale masque silencieusement<br/>
l'import.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune, Python lève une erreur de conflit de noms</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne signale rien, il écrase<br/>
silencieusement l'ancien nom. C'est<br/>
précisément ce qui rend ce piège dangereux.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q19 : Reproductibilité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi utilise-t-on <code>random.seed(42)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour les simulations et les jeux, fixer<br/>
la graine permet de rejouer exactement la<br/>
même suite de tirages pendant la mise au<br/>
point.</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 rendre les tirages plus aléatoires</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse, on les rend<br/>
déterministes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour accélérer significativement le générateur de nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'effet sur la performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour rendre les tirages reproductibles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : même graine, même séquence<br/>
de tirages. Utile pour le débogage, les<br/>
tests, la reproductibilité scientifique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour limiter les tirages aux valeurs inférieures à 42</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la graine initialise l'état du<br/>
générateur, elle ne borne pas les valeurs<br/>
produites.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q20 : Imports d'un module importé</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le fichier <code>outils.py</code> contient :</p>
<pre><code>import math

def aire_disque(r):
    return math.pi * r ** 2</code></pre>
<p>Dans le même dossier, le programme <code>main.py</code><br/>
contient :</p>
<pre><code>import outils

print(outils.aire_disque(2))
print(math.pi)</code></pre>
<p>Que se passe-t-il quand on exécute <code>main.py</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chaque module a son propre espace de noms. Les<br/>
imports faits dans <code>outils.py</code> ne sont visibles que<br/>
dans <code>outils.py</code> : pour utiliser <code>math.pi</code> dans<br/>
<code>main.py</code>, il faut y écrire aussi <code>import math</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>Les deux lignes s'affichent, car <code>import outils</code> importe aussi <code>math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'import de <code>math</code> a lieu dans<br/>
l'espace de noms d'<code>outils</code>, pas dans celui<br/>
de <code>main.py</code>. Le nom <code>math</code> n'existe pas dans<br/>
le programme principal, et <code>print(math.pi)</code><br/>
lève <code>NameError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le premier affichage échoue, car <code>main.py</code> n'a pas importé <code>math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>aire_disque</code> est définie dans<br/>
<code>outils.py</code>, où <code>math</code> est bien importé. Elle<br/>
s'exécute sans problème et affiche<br/>
<code>12.566370614359172</code>. C'est la ligne suivante<br/>
qui échoue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le premier affichage réussit, puis <code>print(math.pi)</code> lève <code>NameError</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>12.566370614359172</code> s'affiche,<br/>
car <code>aire_disque</code> trouve <code>math</code> dans son propre<br/>
module. Puis <code>main.py</code> cherche le nom <code>math</code><br/>
dans son espace de noms, où il n'a jamais été<br/>
importé, et Python lève<br/>
<code>NameError: name 'math' is not defined</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La ligne <code>import outils</code> échoue, car un module ne peut pas en importer un autre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un module peut importer d'autres<br/>
modules, c'est même courant. <code>import outils</code><br/>
réussit et exécute <code>import math</code> à l'intérieur<br/>
d'<code>outils</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q21 : Une précondition vérifiée dans un module</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le fichier <code>geometrie.py</code> contient :<br/>
<pre><code>def aire_rectangle(longueur, largeur):
    assert longueur &gt;= 0 and largeur &gt;= 0
    return longueur * largeur</code></pre><br/>
Dans le même dossier, <code>main.py</code> contient :<br/>
<pre><code>import geometrie
print(geometrie.aire_rectangle(4, 3))
print(geometrie.aire_rectangle(-4, 3))</code></pre><br/>
Que se passe-t-il à l'exécution de <code>main.py</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une assertion placée en tête de fonction garantit sa<br/>
précondition, que la fonction soit appelée depuis son<br/>
propre fichier ou depuis un programme qui importe le<br/>
module. Un appel qui ne la respecte pas lève<br/>
<code>AssertionError</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>12</code> s'affiche, puis le second appel lève <code>AssertionError</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le premier appel respecte la<br/>
précondition et affiche <code>12</code>. Au second,<br/>
<code>longueur &gt;= 0</code> est faux : l'assertion échoue,<br/>
Python lève <code>AssertionError</code> et le programme<br/>
s'arrête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>12</code> puis <code>-12</code> : les assertions d'un module importé sont ignorées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une fonction importée s'exécute<br/>
exactement comme si elle était écrite dans<br/>
<code>main.py</code>. L'assertion est vérifiée à chaque<br/>
appel et échoue pour <code>-4</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien ne s'affiche : l'erreur survient dès la ligne <code>import geometrie</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'import ne fait que définir la<br/>
fonction ; l'assertion n'est évaluée qu'à<br/>
l'appel. Le premier appel affiche donc <code>12</code><br/>
avant que le second échoue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>12</code> puis <code>0</code> : l'assertion remplace la longueur négative par zéro</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>assert</code> ne corrige aucune valeur. Elle<br/>
vérifie une condition et arrête le programme<br/>
avec <code>AssertionError</code> si celle-ci est fausse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q22 : La précondition de random.choice</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La documentation du module <code>random</code> indique :</p>
<p>« <code>random.choice(seq)</code> renvoie un élément choisi au hasard dans<br/>
la séquence <strong>non vide</strong> <code>seq</code>. »</p>
<p>Après <code>import random</code>, lequel de ces appels ne respecte <strong>pas</strong><br/>
cette précondition ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une précondition décrit ce que doivent vérifier les<br/>
arguments. Pour <code>random.choice</code>, seul compte le fait que<br/>
la séquence contienne au moins un élément, quelles que<br/>
soient les valeurs qu'elle contient.</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>random.choice([])</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la liste vide ne contient aucun<br/>
élément à choisir. La précondition « non vide »<br/>
n'est pas respectée, et Python lève <code>IndexError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.choice("abc")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une chaîne de caractères est une<br/>
séquence, indexée comme une liste. L'appel est<br/>
valide et renvoie <code>"a"</code>, <code>"b"</code> ou <code>"c"</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.choice(["pile"])</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste d'un seul élément n'est pas<br/>
vide. L'appel est valide et renvoie toujours<br/>
<code>"pile"</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.choice([0, 0])</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste contient deux éléments, même<br/>
s'ils valent $0$. Elle n'est pas vide, et l'appel<br/>
renvoie <code>0</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q23 : Deux imports étoilés</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi le code suivant peut-il être<br/>
problématique ?<br/>
<pre><code>from random import *
from math import *</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Préférer <code>import math</code> et <code>import random</code>, puis<br/>
écrire <code>math.sqrt</code> ou <code>random.randint</code> : le<br/>
préfixe indique d'où vient chaque nom et évite<br/>
tout écrasement.</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>Parce que des fonctions de même nom s'écrasent silencieusement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>from module import *</code> copie<br/>
tous les noms du module dans le programme.<br/>
Si deux modules, ou le programme lui-même,<br/>
définissent un même nom, le dernier import le<br/>
remplace sans prévenir, et à la lecture on ne<br/>
sait plus d'où vient chaque fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que ces importations sont beaucoup trop lentes à charger</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le coût de chargement est<br/>
négligeable, la performance n'est pas le<br/>
problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que l'on ne peut pas importer deux modules dans un fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on peut importer autant de<br/>
modules qu'on veut dans un même fichier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>math</code> doit impérativement être importé avant <code>random</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python n'impose aucun ordre<br/>
d'importation entre modules indépendants.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q24 : Ordre des imports</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un fichier Python bien organisé, où<br/>
placer les <code>import</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention de lecture : voir tout de suite<br/>
les dépendances en haut du fichier. Un nom<br/>
importé plus bas ne serait pas disponible pour<br/>
le code situé au-dessus.</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>À l'intérieur d'une fonction <code>main</code> appelée au démarrage du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est possible, mais exceptionnel.<br/>
Par convention, les imports se placent en haut<br/>
du fichier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À la fin du fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tous les noms importés ne seraient<br/>
pas disponibles avant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'importe où dans le fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Techniquement possible, mais déconseillé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>En haut du fichier, avant le reste du code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : placés en tête, les imports<br/>
sont exécutés avant toute utilisation des noms<br/>
importés, et le lecteur voit tout de suite de<br/>
quels modules dépend le programme.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — 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>Les modules de la bibliothèque standard et ceux<br/>
que l'on écrit soi-même s'importent de la même<br/>
façon ; leurs fonctions s'utilisent avec le<br/>
préfixe du module ou après un import sélectif.</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>from math import pi</code> importe la constante <code>pi</code> sans préfixe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : importation sélective.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La bibliothèque standard de Python contient des modules pour les fichiers, le réseau, les dates, le hasard, etc.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : « batteries included », l'une des<br/>
forces de Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un fichier <code>.py</code> écrit par l'élève ne peut pas être importé comme module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : tout fichier <code>.py</code><br/>
est un module. Placé dans le dossier du<br/>
programme, il s'importe avec<br/>
<code>import nom_du_fichier</code>, sans l'extension.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>import math</code> rend les fonctions accessibles via le préfixe <code>math.</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est le rôle de <code>import</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q26 : random.random et random.randint</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre <code>random.random()</code> et<br/>
<code>random.randint(a, b)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour mémoriser : <code>random.random()</code> $\to [0\,;\, 1[$<br/>
(flottant) ; <code>random.randint(a, b)</code> $\to [a\,;\, b]$<br/>
(entier) ; <code>random.randrange(a, b)</code> $\to [a\,;\, b[$<br/>
(entier) ; <code>random.choice(seq)</code> $\to$ un élément de<br/>
la séquence. Pour la reproductibilité d'un tirage,<br/>
fixer <code>random.seed(...)</code> au début du programme.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux renvoient un entier, <code>random()</code> entre 0 et 1 et <code>randint(a, b)</code> entre <code>a</code> et <code>b</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction <code>random.random()</code> renvoie un<br/>
flottant, pas un entier (un entier entre 0 et 1<br/>
n'aurait d'ailleurs que deux valeurs possibles).<br/>
Seule <code>randint(a, b)</code> renvoie un entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>random()</code> renvoie un flottant de $[0\,;\, 1[$, <code>randint(a, b)</code> un entier de $[a\,;\, b]$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>random.random()</code> produit un<br/>
flottant tiré uniformément, strictement<br/>
inférieur à $1$, tandis que<br/>
<code>random.randint(a, b)</code> renvoie un entier avec<br/>
les <strong>deux</strong> bornes incluses (alors que la<br/>
plupart des intervalles Python excluent la<br/>
borne droite).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.randint(a, b)</code> renvoie un entier de $[a\,;\, b[$, borne <code>b</code> exclue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est précisément la particularité de<br/>
<code>randint</code> parmi les fonctions du module : la borne<br/>
droite est <strong>incluse</strong>. Pour exclure la borne, il<br/>
faudrait utiliser <code>random.randrange(a, b)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random.random()</code> renvoie un flottant de $[0\,;\, 1]$, borne $1$ comprise</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la borne droite est <strong>exclue</strong> :<br/>
<code>random.random()</code> peut renvoyer $0$ mais jamais<br/>
exactement $1$, comme la plupart des intervalles<br/>
en Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q27 : Fonctions du module math</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les expressions suivantes, laquelle ne renvoie<br/>
<strong>pas</strong> $5$ après l'instruction <code>import math</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques fonctions usuelles du module <code>math</code> :<br/>
<code>sqrt</code> (racine carrée), <code>floor</code> et <code>ceil</code><br/>
(arrondis vers le bas et vers le haut).<br/>
Constante : <code>math.pi</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math.ceil(4.3)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction <code>ceil</code> arrondit vers le haut. Pour<br/>
$4{,}3$, le résultat est $5$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>math.floor(4.9)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>math.floor</code> arrondit vers le<br/>
bas, même quand la partie décimale est proche<br/>
de $1$. Pour $4{,}9$, le résultat est $4$, et<br/>
non $5$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math.sqrt(25)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La racine carrée de $25$ vaut bien $5$. Cette<br/>
expression renvoie donc $5$ (au flottant<br/>
$5{,}0$ près).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math.floor(5.7)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction <code>floor</code> arrondit vers le bas (partie<br/>
entière inférieure). Pour $5{,}7$, le résultat<br/>
est $5$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q28 : Mesurer une durée d'exécution</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On souhaite mesurer la durée d'exécution d'une<br/>
portion de code. Quelle structure utilise le module<br/>
<code>time</code> de manière correcte ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La différence entre deux appels à <code>time.time()</code><br/>
mesure une durée réelle : elle peut varier<br/>
légèrement d'une exécution à l'autre, selon ce<br/>
que fait l'ordinateur au même moment.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>import time
debut = time.time()
# ... code à mesurer ...
duree = time.time()</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque la <strong>soustraction</strong> finale.<br/>
Ici <code>duree</code> contient l'heure de fin (nombre de<br/>
secondes depuis 1970), pas la durée écoulée :<br/>
il faut écrire <code>duree = time.time() - debut</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>import time
debut = time.time()
# ... code à mesurer ...
duree = debut - time.time()</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la soustraction est dans le mauvais<br/>
sens. <code>debut</code> est antérieur à l'heure de fin,<br/>
donc <code>duree</code> est <strong>négative</strong>. Il faut écrire<br/>
<code>time.time() - debut</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>import time
debut = time.time()
# ... code à mesurer ...
duree = time.time() - time.time()</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>debut</code> n'est jamais utilisé. Les deux<br/>
appels à <code>time.time()</code> sont quasi simultanés :<br/>
<code>duree</code> vaut presque 0 quel que soit le code<br/>
mesuré.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>import time
debut = time.time()
# ... code à mesurer ...
duree = time.time() - debut</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>time.time()</code> renvoie le nombre<br/>
de secondes écoulées depuis le $1^{\text{er}}$<br/>
janvier $1970$. La différence entre deux<br/>
appels donne la durée écoulée en secondes<br/>
(avec une précision de l'ordre de la<br/>
microseconde sur les systèmes modernes).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q29 : Le préfixe après un import sélectif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Après <code>from math import sqrt</code>, que produit <code>math.sqrt(16)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>import math</code> donne accès à <code>math.sqrt</code> ; <code>from math import sqrt</code><br/>
donne accès à <code>sqrt</code> seul. Les deux formes ne se mélangent pas.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une erreur, le nom <code>math</code> n'étant pas importé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>from math import sqrt</code> n'introduit que le nom<br/>
<code>sqrt</code>. Le module <code>math</code> lui-même reste inconnu, et il faut<br/>
écrire <code>sqrt(16)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>4.0</code>, <code>math</code> restant accessible</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>sqrt(16)</code> donnerait <code>4.0</code>, mais pas <code>math.sqrt</code>, le<br/>
nom <code>math</code> étant absent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>16</code>, la racine n'étant pas appliquée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune racine n'est calculée, l'expression échoue avant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>4</code>, la racine d'un entier étant un entier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : outre le nom manquant, <code>sqrt</code> renvoie un flottant.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q30 : Un module importé deux fois</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un programme contient deux fois la ligne <code>import random</code>, dans deux<br/>
fichiers différents du projet. Que se passe-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chaque fichier qui utilise un module l'importe ; Python se charge<br/>
de ne le lire qu'une seule fois.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le module n'est chargé qu'une fois, le second <code>import</code> le réutilisant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python garde en mémoire les modules déjà<br/>
chargés. Un nouvel <code>import</code> ne fait que rendre le nom<br/>
disponible dans le fichier courant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, un module ne pouvant être importé qu'une fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : importer plusieurs fois est permis et courant dans un<br/>
projet à plusieurs fichiers.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le module est chargé deux fois et occupe deux fois plus de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le second <code>import</code> retrouve le module déjà chargé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les fonctions du module sont dupliquées sous deux noms</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les noms restent les mêmes, <code>random.randint</code> par<br/>
exemple.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q31 : Arrondir vers le bas ou vers le haut</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Après <code>import math</code>, que valent <code>math.floor(3.7)</code> et<br/>
<code>math.ceil(3.7)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>math.floor</code>, <code>math.ceil</code> et <code>round</code> arrondissent différemment ; le<br/>
choix dépend de ce que l'on veut compter.</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>3</code> et <code>4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>floor</code> arrondit vers le bas, <code>ceil</code> vers le<br/>
haut, et les deux renvoient un entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>4</code> et <code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>floor</code> est le plancher, <code>ceil</code> le plafond.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3</code> et <code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>ceil</code> monte à l'entier supérieur dès que la partie<br/>
décimale n'est pas nulle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3.7</code> et <code>3.7</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les deux fonctions renvoient des entiers.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q32 : Le module pour lire un fichier CSV</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel module de la bibliothèque standard facilite la lecture d'un<br/>
fichier CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La bibliothèque standard couvre les besoins courants : <code>csv</code>,<br/>
<code>math</code>, <code>random</code>, <code>time</code> sont parmi les modules les plus utilisés en<br/>
première.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>csv</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>csv.reader</code> découpe chaque ligne en champs en<br/>
tenant compte du séparateur et des guillemets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>math</code> fournit des fonctions mathématiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>random</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>random</code> sert aux tirages aléatoires.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>time</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>time</code> mesure des durées et donne l'heure.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q33 : La racine d'un nombre négatif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Après <code>import math</code>, que produit <code>math.sqrt(-1)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les fonctions d'un module ont des préconditions, indiquées par leur<br/>
documentation : les respecter évite les erreurs à l'exécution.</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, l'argument devant être positif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fonction a pour précondition un argument<br/>
positif ou nul. Elle refuse <code>-1</code> au lieu de renvoyer un résultat<br/>
sans sens pour les réels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>-1.0</code>, l'argument étant renvoyé tel quel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun réel n'a pour carré <code>-1</code>, et la fonction ne<br/>
renvoie pas l'argument.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>1.0</code>, le signe étant ignoré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>sqrt</code> n'ignore pas le signe, elle signale l'erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>0.0</code>, valeur par défaut en cas de problème</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>0.0</code> est la racine de <code>0</code>, pas de <code>-1</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q34 : Le nom d'un module écrit soi-même</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lina a écrit ses fonctions dans un fichier <code>outils.py</code>, placé dans<br/>
le même dossier que son programme. Comment les importe-t-elle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tout fichier <code>.py</code> est un module : il suffit qu'il soit dans le<br/>
dossier du programme pour être importé par son nom.</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>import outils</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le nom du module est le nom du fichier sans<br/>
l'extension <code>.py</code>. Les fonctions s'appellent ensuite<br/>
<code>outils.nom_de_fonction</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>import outils.py</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'extension ne fait pas partie du nom du module ; cette<br/>
écriture chercherait un sous-module <code>py</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>import "outils.py"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>import</code> attend un nom, pas une chaîne de caractères.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>open("outils.py")</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>open</code> lit le texte du fichier, il n'exécute pas son<br/>
code.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q35 : Ce qui s'exécute à l'import</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le fichier <code>outils.py</code> contient une définition de fonction suivie<br/>
de <code>print("module chargé")</code>. Que se passe-t-il quand un programme<br/>
exécute <code>import outils</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un module bien écrit ne contient que des définitions et des<br/>
constantes, pour que son import n'ait aucun effet visible.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le message s'affiche, le code du module étant exécuté</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : importer un module exécute son fichier de haut<br/>
en bas. Les définitions créent les fonctions, et les autres<br/>
instructions, comme ce <code>print</code>, s'exécutent aussi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Rien ne s'affiche, seules les définitions étant lues</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne distingue pas les définitions du reste, il<br/>
exécute tout.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le message s'affiche à chaque appel d'une fonction du module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le <code>print</code> est au niveau du module, pas dans une<br/>
fonction ; il ne s'exécute qu'à l'import.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur, un module ne pouvant contenir que des fonctions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un module peut contenir n'importe quelle instruction,<br/>
même si l'usage est d'y mettre surtout des définitions.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q36 : Un module qui dépend d'un autre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le module <code>stats.py</code> de Sami commence par <code>import graphiques</code>, un<br/>
module écrit par un camarade. Lina copie <code>stats.py</code> seul sur son<br/>
ordinateur et exécute <code>import stats</code>. Que se passe-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un module hérite des dépendances des modules qu'il importe ;<br/>
partager son code suppose de fournir aussi les modules dont il<br/>
dépend.</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 dès l'import, <code>graphiques</code> étant introuvable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : importer <code>stats</code> exécute sa première ligne, qui<br/>
tente d'importer <code>graphiques</code>. Faute de ce fichier, l'import<br/>
échoue avant que <code>stats</code> ne soit utilisable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>stats</code> s'importe, mais ses fonctions échouent à l'appel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'échec survient dès la ligne <code>import graphiques</code>, donc<br/>
dès l'import de <code>stats</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Python recherche <code>graphiques.py</code> sur l'ordinateur de Sami</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne cherche que dans les dossiers de la machine<br/>
où il s'exécute.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>stats</code> s'importe normalement, <code>graphiques</code> étant ignoré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un import qui échoue arrête l'exécution du module.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
