<?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 (import,<br/>
from ... import), modules standards (math,<br/>
random, os, csv...), 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 .py 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 math en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>import math charge le module et le rend<br/>
accessible sous le nom math. Pour des<br/>
fonctions précises sans préfixe :<br/>
from math import sqrt.</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>require math</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>use math</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>include math</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>import math</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'instruction import rend<br/>
accessible le contenu du module via le<br/>
préfixe math. (ex. math.sqrt(2)).</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 import math, comment appelle-t-on la<br/>
fonction sqrt (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>math-&gt;sqrt(2)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : -&gt; est la syntaxe Perl/PHP.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>math.sqrt(2)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on utilise le préfixe<br/>
module.fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>sqrt(2)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sans préfixe math., Python ne<br/>
connaît pas sqrt.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>math::sqrt(2)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : :: 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 from math import sqrt ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variantes : from math import sqrt, pi (deux<br/>
noms) ou from math import * (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 math dans le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on importe seulement sqrt.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Importe seulement sqrt, appelable directement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on écrit alors sqrt(2)<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, sqrt 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 math..</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renomme le module math en sqrt pour la suite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le renommage à<br/>
l'importation utilise<br/>
le mot-clé as, par<br/>
exemple import math as<br/>
m. La syntaxe from ...<br/>
import 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 math : math.pi,<br/>
math.e, math.inf, math.nan.</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>math.PI</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python distingue majuscules et<br/>
minuscules ; math.PI n'existe pas<br/>
(AttributeError). La constante s'écrit<br/>
math.pi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>math.pi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : après import math,<br/>
math.pi vaut environ 3.141592653589793,<br/>
la meilleure approximation flottante<br/>
disponible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Math.pi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Math avec une majuscule est<br/>
l'objet de JavaScript ; en Python le module<br/>
s'appelle math (NameError sinon).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>math.pi()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : math.pi est une constante (un<br/>
flottant), pas une fonction : les<br/>
parenthèses provoquent TypeError<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>random 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 secrets (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>numpy</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Existe et a un sous-module random, 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>math</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : math est pour les fonctions<br/>
mathématiques classiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>random</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : random.randint(a, b),<br/>
random.choice(liste), random.shuffle(...),<br/>
etc.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>stochastic</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 random.randint(1, 6) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinction subtile : random.randint(a, b)<br/>
→ bornes <strong>incluses</strong> ; random.randrange(a,<br/>
b) → b <strong>exclue</strong> (comme range).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>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 : randint 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 à range, 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 import math as m ?</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, math et m</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul module est chargé ; m n'est<br/>
qu'un second nom pour le désigner.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Importe math mais le rend accessible sous le nom m</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : as m crée un <strong>alias</strong>. On<br/>
écrit ensuite m.sqrt(2) ; le nom math seul<br/>
n'est pas défini et math.sqrt(2) lève<br/>
NameError. 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 as</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe import x as y est<br/>
valide et courante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Importe seulement la fonction m du module math</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est tout math qui est importé,<br/>
simplement accessible via m. Importer un<br/>
seul nom s'écrit from math import sqrt.</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 pip install nom_du_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="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 : math, random, os,<br/>
sys, csv, json, datetime,<br/>
urllib... 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>`<code>python<br/>
import math<br/>
print(math.sqrt(16))<br/>
</code>`<br/>
Que produit ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour un entier, utiliser int(math.sqrt(16))<br/>
ou math.isqrt(16) (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 16.0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sqrt calcule la <strong>racine</strong>, pas<br/>
l'identité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Affiche 4.0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : math.sqrt(16) = 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 4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas tout à fait : sqrt renvoie un<br/>
<strong>flottant</strong> (4.0), 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/>
from math import * ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : import math (préfixe) ou<br/>
from math import sqrt, pi (sélectif).<br/>
Éviter from x import * 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 pow, elle serait écrasée par<br/>
math.pow. 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/>
mes_outils.py 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/>
.py.</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é module 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 .py est<br/>
d'office un module.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il faut compiler mes_outils.py 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 import mes_outils</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tout fichier .py est un<br/>
module. On crée mes_outils.py avec ses<br/>
fonctions, et import mes_outils 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 d'abord publier le module sur PyPI pour l'importer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : PyPI ne sert qu'au partage<br/>
public. Localement, le fichier suffit.</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 import math 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 importlib.reload. 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 entièrement dupliqué une seconde fois 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 fois ; le second import 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 (sys.modules).<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 random permet de<br/>
choisir un élément au hasard dans une liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Autres fonctions utiles : random.choices<br/>
(avec poids), random.sample (sans<br/>
remise), random.shuffle (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>random.select(liste)</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>random.random(liste)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : random.random() renvoie un<br/>
flottant entre 0 et 1, sans paramètre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>random.choice(liste)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : choice 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>random.pick(liste)</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 if __name__ == "__main__": ?</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 a passé tous ses tests sans erreur</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 seulement si le fichier est lancé directement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : __name__ vaut<br/>
"__main__" en exécution directe et le<br/>
nom du module en cas d'import (le bloc est<br/>
alors ignoré). Cet idiome permet d'avoir<br/>
des fichiers à la fois modules <strong>et</strong><br/>
scripts.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Que le programme s'exécute en mode débogage pas à pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun mode de débogage<br/>
n'est associé à cette<br/>
construction. La variable<br/>
__name__ 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 nommée main doit obligatoirement être définie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas tout à fait : main 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 : ?math.sqrt<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>help(math.sqrt)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la fonction native help<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>man math.sqrt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : man est une commande Unix.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>info(math.sqrt)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de fonction info en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>google math.sqrt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune commande google<br/>
n'existe dans la console<br/>
Python. La documentation<br/>
intégrée s'obtient avec<br/>
la fonction help, 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 pi correctement après<br/>
from math import pi ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>import math → math.pi ; from math import<br/>
pi → pi. 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>math.pi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec from ... import, on<br/>
n'utilise <strong>pas</strong> le préfixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>pi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pi est importé<br/>
directement dans l'espace de noms local.<br/>
On peut écrire 2 * pi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>import.pi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe invalide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>from.pi</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>``python<br/>
from math import sqrt</p>
<p>def sqrt(x):<br/>
    return x ** 0.5</p>
<p>print(sqrt(16))<br/>
``<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 (import math) 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 sqrt importée du module math</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 sqrt, 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 sqrt 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 4.0. 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 random.seed(42) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Important : random n'est pas<br/>
cryptographiquement sûr (utiliser secrets<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 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 outils.py contient :</p>
<p>``python<br/>
import math</p>
<p>def aire_disque(r):<br/>
    return math.pi <em> r </em>* 2<br/>
`</p>
<p>Dans le même dossier, le programme main.py<br/>
contient :</p>
<p>`python<br/>
import outils</p>
<p>print(outils.aire_disque(2))<br/>
print(math.pi)<br/>
`</p>
<p>Que se passe-t-il quand on exécute main.py` ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chaque module a son propre espace de noms. Les<br/>
imports faits dans outils.py ne sont visibles que<br/>
dans outils.py : pour utiliser math.pi dans<br/>
main.py, il faut y écrire aussi import math.</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 import outils importe aussi math</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'import de math a lieu dans<br/>
l'espace de noms d'outils, pas dans celui<br/>
de main.py. Le nom math n'existe pas dans<br/>
le programme principal, et print(math.pi)<br/>
lève NameError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le premier affichage échoue, car main.py n'a pas importé math</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aire_disque est définie dans<br/>
outils.py, où math est bien importé. Elle<br/>
s'exécute sans problème et affiche<br/>
12.566370614359172. 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 print(math.pi) lève NameError</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 12.566370614359172 s'affiche,<br/>
car aire_disque trouve math dans son propre<br/>
module. Puis main.py cherche le nom math<br/>
dans son espace de noms, où il n'a jamais été<br/>
importé, et Python lève<br/>
NameError: name 'math' is not defined.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La ligne import outils é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. import outils<br/>
réussit et exécute import math à l'intérieur<br/>
d'outils.</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 pygame) qui n'est pas dans la<br/>
bibliothèque standard ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>pip gère aussi les dépendances entre<br/>
modules. Pour un projet, un fichier<br/>
requirements.txt 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 pip install pygame dans le terminal</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pip est l'outil<br/>
d'installation officiel de Python.<br/>
pip install nom télécharge depuis PyPI<br/>
(Python Package Index).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec l'instruction download pygame exécutée 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 import pygame</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : import charge un module <strong>déjà 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/>
pip 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 s'exécute plus rapidement qu'un package</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a aucune différence de<br/>
performance entre les deux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un package est un module compilé en code machine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune compilation en jeu ; la<br/>
différence est purement structurelle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune, les deux mots désignent la même chose</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce sont deux notions différentes,<br/>
l'une est un fichier, l'autre un répertoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un package est un répertoire regroupant plusieurs modules</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un module est un fichier<br/>
.py, un package un répertoire qui regroupe<br/>
plusieurs modules. Les grandes bibliothèques<br/>
scientifiques sont organisées ainsi ; on<br/>
accède à un sous-module avec la notation<br/>
pointée, paquet.sousmodule.</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/>
`<code>python<br/>
from random import <em><br/>
from math import </em><br/>
</code>`</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 des fonctions de même nom s'écrasent silencieusement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les deux modules ont par<br/>
exemple chacun une fonction pow, et le<br/>
second import écrase la première sans<br/>
prévenir. Conflit silencieux, source de<br/>
bugs très difficiles à diagnostiquer.</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 math doit impérativement être importé avant random</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 import ?</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>À l'intérieur d'une fonction main appelée au démarrage du programme</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 (math,<br/>
os...), puis les externes (numpy,<br/>
pandas...), 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>from math import pi importe la constante pi 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 sys.modules.<br/>
Un module n'est chargé <strong>qu'une seule 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>import math rend les fonctions accessibles via le préfixe math.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est le rôle de import.</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 random.random() et<br/>
random.randint(a, b) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour mémoriser : random.random() → [0 ; 1[<br/>
(flottant) ; random.randint(a, b) → [a ; b]<br/>
(entier) ; random.randrange(a, b) → [a ; b[<br/>
(entier) ; random.choice(seq) → un élément de<br/>
la séquence. Pour la reproductibilité d'un tirage,<br/>
fixer random.seed(...) 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, random() entre 0 et 1 et randint(a, b) entre a et b</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction random.random() renvoie un<br/>
flottant, pas un entier (un entier entre 0 et 1<br/>
n'aurait d'ailleurs que deux valeurs possibles).<br/>
Seule randint(a, b) renvoie un entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>random() renvoie un flottant de [0 ; 1[, randint(a, b) un entier de [a ; b]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : random.random() produit un<br/>
flottant tiré uniformément, strictement<br/>
inférieur à 1, tandis que<br/>
random.randint(a, b) 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>random.randint(a, b) renvoie un entier de [a ; b[, borne b exclue</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est précisément la particularité de<br/>
randint parmi les fonctions du module : la borne<br/>
droite est <strong>incluse</strong>. Pour exclure la borne, il<br/>
faudrait utiliser random.randrange(a, b).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>random.random() 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/>
random.random() 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 import math ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques fonctions usuelles du module math :<br/>
sqrt (racine carrée), floor et ceil (arrondis<br/>
bas et haut), log (logarithme népérien),<br/>
log10 (logarithme décimal), exp (exponentielle),<br/>
sin/cos/tan (trigonométrie en radians).<br/>
Constantes : math.pi, math.e, math.inf.</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>math.ceil(4.3)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction ceil 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>math.log(100)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : math.log 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 math.log10(100) ou<br/>
math.log(100, 10).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>math.sqrt(25)</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>math.floor(5.7)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction floor 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/>
time 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 time.perf_counter() à<br/>
time.time(). Pour comparer la performance de<br/>
plusieurs implémentations, le module timeit 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[<p>`<code>python<br/>
import time<br/>
debut = time.time()<br/>
# ... code à mesurer ...<br/>
duree = time.time()<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque la <strong>soustraction</strong> finale.<br/>
Ici duree contient l'heure de fin (nombre de<br/>
secondes depuis 1970), pas la durée écoulée :<br/>
il faut écrire duree = time.time() - debut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
import time<br/>
debut = time.time()<br/>
# ... code à mesurer ...<br/>
duree = debut - time.time()<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la soustraction est dans le mauvais<br/>
sens. debut est antérieur à l'heure de fin,<br/>
donc duree est <strong>négative</strong>. Il faut écrire<br/>
time.time() - debut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
import time<br/>
debut = time.time()<br/>
# ... code à mesurer ...<br/>
duree = time.time() - time.time()<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : debut n'est jamais utilisé. Les deux<br/>
appels à time.time() sont quasi simultanés :<br/>
duree vaut presque 0 quel que soit le code<br/>
mesuré.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
import time<br/>
debut = time.time()<br/>
# ... code à mesurer ...<br/>
duree = time.time() - debut<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : time.time() 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>
