<?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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un module est un fichier, pas un<br/>
type.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un fichier <code>.py</code> contenant des fonctions, des classes ou des constantes réutilisables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un module regroupe du code<br/>
réutilisable. On peut importer un module<br/>
dans un autre programme pour utiliser ses<br/>
fonctions sans les recoder.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une boucle imbriquée</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</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 tout le module <code>math</code></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 la fonction <code>sqrt</code>, qui devient appelable directement comme <code>sqrt(2)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 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>Cela ne fonctionne pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renomme <code>math</code> en <code>sqrt</code></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>PI</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de constante <code>PI</code> en majuscules.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>math.pi</code> (après <code>import math</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>math.pi</code> ≈<br/>
3.141592653589793. Pour la précision<br/>
maximale flottante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3.14</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est une approximation, mais le module<br/>
<code>math</code> offre une valeur plus précise.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>pi</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>pi</code> n'est pas une variable<br/>
globale par défaut. Il faut l'importer.</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. Pour des usages cryptographiques,<br/>
préférer <code>secrets</code> (plus sûr).</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>numpy</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Existe et a un sous-module <code>random</code>, mais<br/>
ce n'est pas la bibliothèque <strong>standard</strong><br/>
(à installer séparément).</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 numpy as np</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention de la communauté Python : on<br/>
utilise toujours les mêmes alias pour les<br/>
grandes bibliothèques scientifiques.</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>numpy</code> et <code>np</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul module avec deux noms.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Importe <code>numpy</code> mais le renomme en <code>np</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>as np</code> crée un <strong>alias</strong>.<br/>
Pratique pour les modules à nom long.<br/>
Convention : <code>numpy as np</code>,<br/>
<code>pandas as pd</code>, <code>matplotlib.pyplot as plt</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Erreur de syntaxe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe <code>import x as y</code> est<br/>
valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Importe seulement <code>np</code> (pas <code>numpy</code> au complet)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est tout <code>numpy</code> qui est importé,<br/>
juste accessible via <code>np</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>Pour les modules <strong>externes</strong> (numpy, pandas,<br/>
matplotlib, requests...), il faut installer<br/>
avec <code>pip install nom_du_module</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 officielle</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, disponibles sans installation supplémentaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>math</code>, <code>random</code>, <code>os</code>,<br/>
<code>sys</code>, <code>csv</code>, <code>json</code>, <code>datetime</code>,<br/>
<code>urllib</code>... tous prêts à l'emploi. C'est<br/>
l'une des grandes forces de Python<br/>
(« batteries included »).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La bibliothèque physique d'Anthropic</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La bibliothèque standard<br/>
de Python est un ensemble<br/>
de modules logiciels<br/>
maintenu par la Python<br/>
Software Foundation. Elle<br/>
n'a aucun lien avec<br/>
Anthropic ni avec une<br/>
collection physique.</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 c'est trop lent</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 cela importe tous les noms dans le scope global, ce qui peut masquer des variables/fonctions existantes (collisions)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par exemple, si vous<br/>
aviez une variable <code>pow</code>, elle serait<br/>
écrasée par <code>math.pow</code>. Source de bugs<br/>
subtils.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que c'est interdit par Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : possible mais déconseillé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que cela ne fonctionne pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide.</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 un mot-clé <code>module</code> dans le fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun mot-clé spécial.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut compiler le module avant de l'importer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python est interprété, pas de<br/>
compilation explicite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Créer un fichier <code>mes_outils.py</code> contenant des fonctions, puis dans un autre fichier du même répertoire : <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. Aucune déclaration spéciale n'est<br/>
nécessaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut publier le module sur PyPI</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : seulement pour le partage public.<br/>
Localement, il suffit du fichier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q13 : Import une seule fois</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Si l'on écrit <code>import math</code> deux fois dans le<br/>
même programme, que se passe-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour vraiment recharger un module modifié<br/>
(rare), utiliser <code>importlib.reload</code>. Sinon,<br/>
le cache simplifie la vie.</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>Cela lève une erreur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le module est dupliqué en mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul exemplaire en mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le module n'est chargé qu'une seule fois ; la deuxième instruction ne fait rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python tient un cache des<br/>
modules déjà chargés (<code>sys.modules</code>).<br/>
Performance optimale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le module est rechargé à chaque fois (lent)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python optimise.</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 : Bloc principal</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie l'idiome <code>if __name__ == "__main__":</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma standard pour rendre un fichier<br/>
réutilisable comme module sans déclencher<br/>
ses tests/démos lors de l'import.</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>Que le programme est sans bug</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La présence de cette<br/>
condition n'apporte<br/>
aucune garantie sur la<br/>
correction du programme.<br/>
Elle distingue uniquement<br/>
un script exécutable d'un<br/>
module importable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Que le bloc s'exécute uniquement quand le fichier est lancé directement, pas quand il est importé comme module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>__name__</code> vaut<br/>
<code>"__main__"</code> en exécution directe et le<br/>
nom du module en import. Cet idiome<br/>
permet d'avoir des fichiers à la fois<br/>
modules <strong>et</strong> scripts.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que le programme est en mode débogage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun mode de débogage<br/>
n'est associé à cette<br/>
construction. La variable<br/>
<code>__name__</code> reflète le<br/>
contexte d'exécution :<br/>
script lancé directement<br/>
ou module importé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que la fonction <code>main</code> doit être définie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas tout à fait : <code>main</code> n'est qu'une<br/>
convention, pas obligatoire.</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>Autre forme utile en interactif : <code>?math.sqrt</code><br/>
(en IPython/Jupyter). Et toujours la<br/>
documentation officielle :<br/>
docs.python.org.</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 docstring et les annotations<br/>
de la fonction. Très utile en exploration.</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>google math.sqrt</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune commande <code>google</code><br/>
n'existe dans la console<br/>
Python. La documentation<br/>
intégrée s'obtient avec<br/>
la fonction <code>help</code>, qui<br/>
affiche directement la<br/>
docstring associée.</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 de <code>math</code> (4.0)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la définition locale <strong>écrase</strong><br/>
l'import.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux fonctions sont appelées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul nom à la fois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La fonction <code>sqrt</code> définie localement, qui retourne aussi <code>4.0</code> puisqu'elle calcule également la racine carrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la dernière définition<br/>
gagne. Les deux fonctions calculent la<br/>
même chose (la racine carrée) et donnent<br/>
donc le même résultat sur cet exemple,<br/>
mais en général c'est un piège : la<br/>
définition locale masque silencieusement<br/>
l'import.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Erreur : conflit de noms</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'erreur en Python (qui<br/>
écrase silencieusement).</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>Important : <code>random</code> n'est pas<br/>
cryptographiquement sûr (utiliser <code>secrets</code><br/>
pour cela). Mais pour les simulations et<br/>
jeux, c'est parfait.</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 le générateur</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 : avec la même graine, on obtient toujours la même séquence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : utile pour le débogage,<br/>
les tests, la reproductibilité<br/>
scientifique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour générer le nombre 42</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>seed</code> initialise le générateur<br/>
aléatoire, ne génère rien directement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q20 : Modules variés</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel de ces modules de la bibliothèque<br/>
standard est utilisé pour manipuler des<br/>
<strong>fichiers JSON</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Modules NSI utiles : <code>math</code>, <code>random</code>, <code>csv</code>,<br/>
<code>json</code>, <code>time</code>, <code>datetime</code>, <code>os</code>, <code>sys</code>,<br/>
<code>string</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>json</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : fonctions principales<br/>
<code>json.dumps</code> (objet → chaîne JSON) et<br/>
<code>json.loads</code> (chaîne JSON → objet<br/>
Python).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>csv</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est pour les fichiers CSV.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>math</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour les fonctions mathématiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>os</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est pour interagir avec le système<br/>
d'exploitation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q21 : Installer un module externe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment installe-t-on un module externe (par<br/>
exemple <code>numpy</code>) qui n'est pas dans la<br/>
bibliothèque standard ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>pip</code> gère aussi les dépendances entre<br/>
modules. Pour un projet, un fichier<br/>
<code>requirements.txt</code> listant les dépendances<br/>
facilite la reproductibilité.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec la commande <code>pip install numpy</code> (dans le terminal)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>pip</code> est l'outil<br/>
d'installation officiel de Python.<br/>
<code>pip install nom</code> télécharge depuis PyPI<br/>
(Python Package Index).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>download numpy</code> dans Python</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>Avec <code>import numpy</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>import</code> charge un module <strong>déjà<br/>
installé</strong>, ne l'installe pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut le télécharger manuellement et le copier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'était possible historiquement, mais<br/>
<code>pip</code> automatise tout cela.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q22 : Package</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre un <strong>module</strong> et<br/>
un <strong>package</strong> en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En NSI Première, on travaille surtout avec<br/>
des modules simples. Les packages sont une<br/>
structuration plus avancée pour les gros<br/>
projets.</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 module est plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de différence de<br/>
performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un package est un module compilé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de compilation Python directe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont deux notions différentes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un module est un fichier <code>.py</code> ; un package est un répertoire contenant plusieurs modules (et un fichier <code>__init__.py</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>numpy</code>, <code>pandas</code>, etc.<br/>
sont des packages (répertoires). On<br/>
accède à leurs sous-modules avec<br/>
<code>numpy.linalg</code>, etc.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modules Python — Q23 : Pollution du namespace</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>Maxime PEP 20 : « Explicit is better than<br/>
implicit. » Préférer les imports explicites<br/>
pour la traçabilité.</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 les deux modules peuvent avoir des fonctions de même nom (par exemple <code>pow</code>), et le second import écrase silencieusement le premier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : conflit silencieux,<br/>
source de bugs très difficiles à<br/>
diagnostiquer. À éviter dans tout code<br/>
sérieux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que c'est trop lent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : performance acceptable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que l'on ne peut pas importer plusieurs modules</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on peut importer autant qu'on veut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que <code>math</code> doit être importé avant <code>random</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun ordre imposé.</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.<br/>
Beaucoup d'éditeurs (et d'analyseurs<br/>
statiques) vérifient cet ordre.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dans une fonction <code>main</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible (chargement paresseux) mais<br/>
exceptionnel. Convention : en haut.</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, regroupés (standards / externes / locaux)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : convention PEP 8 :<br/>
d'abord les imports standards (<code>math</code>,<br/>
<code>os</code>...), puis les externes (<code>numpy</code>,<br/>
<code>pandas</code>...), puis les modules locaux du<br/>
projet, séparés par une ligne vide.</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>Le cache de modules garantit la cohérence<br/>
(un seul exemplaire en mémoire) et la<br/>
performance.</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>Tout module importé est systématiquement rechargé à chaque exécution du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : Python met<br/>
en cache les modules dans <code>sys.modules</code>.<br/>
Un module n'est chargé <strong>qu'une seule<br/>
fois</strong> par exécution, même si on l'importe<br/>
dans plusieurs fichiers.</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 compris entre 0 et 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction <code>random.random()</code> renvoie un<br/>
flottant, pas un entier. Et <code>randint(a, b)</code> peut<br/>
renvoyer n'importe quel entier de l'intervalle, pas<br/>
seulement $0$ ou $1$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>random.random()</code> renvoie un flottant tiré uniformément dans $[0\,;\, 1[$ ; <code>random.randint(a, b)</code> renvoie un entier tiré uniformément dans $[a\,;\, b]$ (bornes incluses)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>random.random()</code> produit un<br/>
flottant inférieur à $1$, tandis que<br/>
<code>random.randint(a, b)</code> est l'unique fonction du<br/>
module à inclure les <strong>deux</strong> bornes (alors que<br/>
la plupart des intervalles Python excluent la<br/>
borne droite).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction <code>random.randint(a, b)</code> exclut la borne <code>b</code></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 l'heure courante ; <code>random.randint</code> lit la mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune des deux fonctions n'est liée à<br/>
l'heure ni à la mémoire. Elles produisent toutes<br/>
deux des valeurs pseudo-aléatoires.</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> (arrondis<br/>
bas et haut), <code>log</code> (logarithme népérien),<br/>
<code>log10</code> (logarithme décimal), <code>exp</code> (exponentielle),<br/>
<code>sin</code>/<code>cos</code>/<code>tan</code> (trigonométrie en radians).<br/>
Constantes : <code>math.pi</code>, <code>math.e</code>, <code>math.inf</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.log(100)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>math.log</code> calcule le logarithme<br/>
<strong>naturel</strong> par défaut, pas le logarithme<br/>
décimal. On a $\ln(100) \approx 4{,}605$, et non<br/>
$5$. Pour le logarithme en base $10$, il faut<br/>
écrire <code>math.log10(100)</code> ou<br/>
<code>math.log(100, 10)</code>.</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>Pour des mesures plus précises ou de très courtes<br/>
durées, préférer <code>time.perf_counter()</code> à<br/>
<code>time.time()</code>. Pour comparer la performance de<br/>
plusieurs implémentations, le module <code>timeit</code> est<br/>
adapté : il exécute le code plusieurs fois et<br/>
atténue les fluctuations.</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
duree = time.mesure(code)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune fonction <code>time.mesure</code> n'existe.<br/>
Pour mesurer du code de manière plus fine, on<br/>
utilise plutôt le module dédié <code>timeit</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>import time
duree = time.now()</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction <code>time.now()</code> n'existe pas.<br/>
Cette confusion vient peut-être du module<br/>
<code>datetime</code>, qui propose <code>datetime.now()</code> pour<br/>
obtenir un objet date complet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>import time
duree = time.sleep(10)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>time.sleep(10)</code> met le programme en<br/>
pause pendant $10$ secondes. Cette fonction ne<br/>
mesure rien : elle attend le délai indiqué et<br/>
renvoie <code>None</code>.</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>

</quiz>
