
%load_ext autoreload
%autoreload 2
modules¶
bibliothèque standard¶
un grand nombre d’outils installés d’office
pour des tâches très variées
voir liste complète
cette boite à outils est exposée au travers de modules
que l’on peut charger dans son appli grâce au mot-clé import
import
¶
# import permet de charger un code
import math
# cela définit une variable, ici 'math'
# qui est une référence
# vers un objet module
math
<module 'math' from '/usr/share/miniconda/envs/python-numérique/lib/python3.9/lib-dynload/math.cpython-39-x86_64-linux-gnu.so'>
type(math)
module
# cet objet possède des attributs
# auxquels on peut accéder
# avec la notation module.attribut
math.pi
3.141592653589793
autres formes¶
# avec cette forme on ne définit pas la variable math
# mais directement la variable pi
from math import pi
pi
3.141592653589793
# ici cos n'est pas défini, math.cos l'est
math.cos(pi)
-1.0
installation de librairies tierces¶
si on a besoin d’installer un module
qui ne fait pas partie de la bibliothèque standard :
répertoire disponible sur https://pypi.org/
installation à faire avec l’outil
pip
(se lance depuis le terminal)
# cette astuce avec le ! me permet
# d'appeler une commande normalement destinée au terminal
# mais depuis Python
!pip search nbautoeval
ERROR: XMLRPC request failed [code: -32500]
RuntimeError: PyPI's XMLRPC API is currently disabled due to unmanageable load and will be deprecated in the near future. See https://status.python.org/ for more information.
!pip install nbautoeval
Requirement already satisfied: nbautoeval in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (1.7.0)
Requirement already satisfied: numpy in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (1.21.1)
Requirement already satisfied: ipywidgets in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (7.6.3)
Requirement already satisfied: ipython in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (7.25.0)
Requirement already satisfied: PyYAML in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (5.4.1)
Requirement already satisfied: myst-parser in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbautoeval) (0.13.7)
Requirement already satisfied: jedi>=0.16 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.18.0)
Requirement already satisfied: matplotlib-inline in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.1.2)
Requirement already satisfied: setuptools>=18.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (52.0.0.post20210125)
Requirement already satisfied: pickleshare in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.7.5)
Requirement already satisfied: pexpect>4.3 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (4.8.0)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (3.0.19)
Requirement already satisfied: traitlets>=4.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (5.0.5)
Requirement already satisfied: backcall in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (0.2.0)
Requirement already satisfied: pygments in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (2.9.0)
Requirement already satisfied: decorator in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipython->nbautoeval) (5.0.9)
Requirement already satisfied: parso<0.9.0,>=0.8.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jedi>=0.16->ipython->nbautoeval) (0.8.2)
Requirement already satisfied: ptyprocess>=0.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from pexpect>4.3->ipython->nbautoeval) (0.7.0)
Requirement already satisfied: wcwidth in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython->nbautoeval) (0.2.5)
Requirement already satisfied: ipython-genutils in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from traitlets>=4.2->ipython->nbautoeval) (0.2.0)
Requirement already satisfied: nbformat>=4.2.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (5.1.3)
Requirement already satisfied: widgetsnbextension~=3.5.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (3.5.1)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (1.0.0)
Requirement already satisfied: ipykernel>=4.5.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipywidgets->nbautoeval) (6.0.3)
Requirement already satisfied: tornado<7.0,>=4.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets->nbautoeval) (6.1)
Requirement already satisfied: debugpy<2.0,>=1.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets->nbautoeval) (1.4.1)
Requirement already satisfied: jupyter-client<7.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from ipykernel>=4.5.1->ipywidgets->nbautoeval) (6.1.12)
Requirement already satisfied: jupyter-core>=4.6.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jupyter-client<7.0->ipykernel>=4.5.1->ipywidgets->nbautoeval) (4.7.1)
Requirement already satisfied: pyzmq>=13 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jupyter-client<7.0->ipykernel>=4.5.1->ipywidgets->nbautoeval) (22.1.0)
Requirement already satisfied: python-dateutil>=2.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jupyter-client<7.0->ipykernel>=4.5.1->ipywidgets->nbautoeval) (2.8.2)
Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbformat>=4.2.0->ipywidgets->nbautoeval) (3.2.0)
Requirement already satisfied: six>=1.11.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nbautoeval) (1.16.0)
Requirement already satisfied: pyrsistent>=0.14.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nbautoeval) (0.18.0)
Requirement already satisfied: attrs>=17.4.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->nbautoeval) (20.3.0)
Requirement already satisfied: notebook>=4.4.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (6.4.0)
Requirement already satisfied: Send2Trash>=1.5.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (1.7.1)
Requirement already satisfied: argon2-cffi in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (20.1.0)
Requirement already satisfied: terminado>=0.8.3 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.10.1)
Requirement already satisfied: prometheus-client in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.11.0)
Requirement already satisfied: jinja2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (3.0.1)
Requirement already satisfied: nbconvert in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (5.6.1)
Requirement already satisfied: cffi>=1.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (1.14.6)
Requirement already satisfied: pycparser in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (2.20)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (2.0.1)
Requirement already satisfied: docutils<0.18,>=0.15 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (0.16)
Requirement already satisfied: mdit-py-plugins~=0.2.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (0.2.6)
Requirement already satisfied: markdown-it-py~=0.6.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (0.6.2)
Requirement already satisfied: sphinx<4,>=2.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from myst-parser->nbautoeval) (3.5.4)
Requirement already satisfied: sphinxcontrib-htmlhelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.0.0)
Requirement already satisfied: sphinxcontrib-applehelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.2)
Requirement already satisfied: sphinxcontrib-jsmath in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.1)
Requirement already satisfied: snowballstemmer>=1.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.1.0)
Requirement already satisfied: babel>=1.3 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.9.1)
Requirement already satisfied: sphinxcontrib-serializinghtml in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.1.5)
Requirement already satisfied: sphinxcontrib-devhelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.2)
Requirement already satisfied: packaging in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (21.0)
Requirement already satisfied: imagesize in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.2.0)
Requirement already satisfied: sphinxcontrib-qthelp in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (1.0.3)
Requirement already satisfied: requests>=2.5.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (2.26.0)
Requirement already satisfied: alabaster<0.8,>=0.7 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from sphinx<4,>=2.1->myst-parser->nbautoeval) (0.7.12)
Requirement already satisfied: pytz>=2015.7 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from babel>=1.3->sphinx<4,>=2.1->myst-parser->nbautoeval) (2021.1)
Requirement already satisfied: certifi>=2017.4.17 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (2021.5.30)
Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (2.0.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (1.26.6)
Requirement already satisfied: idna<4,>=2.5 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from requests>=2.5.0->sphinx<4,>=2.1->myst-parser->nbautoeval) (3.2)
Requirement already satisfied: testpath in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.5.0)
Requirement already satisfied: entrypoints>=0.2.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.3)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (1.4.3)
Requirement already satisfied: mistune<2,>=0.8.1 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.8.4)
Requirement already satisfied: bleach in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (3.3.1)
Requirement already satisfied: defusedxml in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.7.1)
Requirement already satisfied: webencodings in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets->nbautoeval) (0.5.1)
Requirement already satisfied: pyparsing>=2.0.2 in /usr/share/miniconda/envs/python-numérique/lib/python3.9/site-packages (from packaging->sphinx<4,>=2.1->myst-parser->nbautoeval) (2.4.7)
import nbautoeval
c’est quoi un module ?¶
un module est un objet Python qui correspond à un fichier (ou répertoire) source
depuis cet objet vous pouvez accéder à des attributs
avec la notation module.attribut
(qui est la même notion que, par ex., str.capitalize
)
le module a autant d’attributs que d’objets globaux dans le source
dans le cas d’un répertoire les attributs référencent d’autres modules
# regarder le contenu
!cat mod.py
# variable globale au module
foo = 1
# fonction globale au module
def bar(n):
x = 10
print(f"dans bar, n={n} et x={x}")
import mod
# tous les noms dans le module (y compris les noms "internes")
dir(mod)
['__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'bar',
'foo']
# une fois le bruit éliminé
[x for x in dir(mod) if '__' not in x]
['bar', 'foo']
notion de point d’entrée¶
votre programme Python est toujours exécuté par un interpréteur
qui “commence” quelque part: c’est le point d’entrée
si vous lancez
$ python3 foo.py
le point d’entrée dans ce cas est
(le module correspondant à) foo.py
recherche des modules¶
Python recherche les modules dans plusieurs d’endroits (répertoires)
le répertoire qui contient le point d’entrée
en option, la variable d’environnement
PYTHONPATH
là où sont installés les morceaux de la librairie standard
conseil : évitez de bidouiller PYTHONPATH
organisation de votre code¶
cela signifie que pour commencer,
on peut sans souci couper son code en fichiers
et les mettre tous dans le même répertoire
c’est une pratique courante et recommandée
il faut apprendre à découper
notamment pour augmenter la réutilisabilité
librairies utiles¶
liste largement non exhaustive
gestion des fichiers:
from pathlib import Path
génération de nombres aléatoires
import random
télécharger depuis Internet:
import requests
ouverture de fichiers au format JSON:
import json
(standard)Python scientifique:
numpy
,pandas
,matplotlib
, …
module pathlib
¶
fait partie de la librairie standard
permet de faire des calculs sur les fichiers
lister les fichiers présents
calculs sur les chemins et noms de fichier
accéder aux métadata (taille, date, …)
# ici Path correspond à une classe
# on verra la théorie très bientôt
from pathlib import Path
# on recherche dans le répertoire courant '.'
# les fichiers/répertoires d'extension '.ipynb'
local_files = Path('.').glob('*.ipynb')
# observons les fichiers trouvés
for file in local_files:
print('name', file.name)
print('stem', file.stem)
print('suffix', file.suffix)
print('absolute()', file.absolute())
print('size', file.stat().st_size)
break
module random
¶
une fois que vous avez le nom du module,
il vous suffit de consulter la doc
complète
pour cela taper dans google python random module
(nous reviendrons sur ce module lors de l’étude des librairies numériques)
import random
# entre 0 et 1
random.random()
0.15174514497850267
# un entier entre deux bornes
# inclusivement
random.randint(0, 10)
9
module requests
¶
télécharger du contenu depuis une URL
accéder à l’entête http
plus flexible que l’équivalent dans la librairie standard urllib2
import requests
url = ""
url = "https://github.com/timeline.json"
request = requests.get(url)
print(f"code de retour HTTP: {request.status_code}")
code de retour HTTP: 410
raw_content = request.text
# une chaine de caractères
type(raw_content)
str
# le début de cette chaine
raw_content[:120]
# son contenu est en format json (voir slide suivante)
'{"message":"Hello there, wayfaring stranger. If you’re reading this then you probably didn’t see our blog post a couple '
module json
¶
le cas qu’on vient de voir est très fréquent
JSON est un format texte (compatible réseau donc Internet)
mais qui conserve un minimum de structure :
permet de transmettre listes et dictionnaires
# pour décoder le JSON qu'on a lu
# et qui est dans la str raw_content
import json
decoded = json.loads(raw_content)
type(decoded) # la chaîne contenait un dict Pyhon
dict
# cette fois on a un peu
# de structure
for k, v in decoded.items():
print(f"{k}\n\t{v[:20]}...")
message
Hello there, wayfari...
documentation_url
https://docs.github....
gestion de fichiers¶
# pour écrire dans un fichier
with open("tutu.txt", "w") as writer:
for i in range(4):
print(f"i={i}", file=writer)
with open...
ouvre le fichier tutu.txt
en écriture "w"
et crée la variable writer
de type File
writer
n’est visible que dans le with
print(..., file=writer)
écrit dans ce fichier
with
ferme le fichier à la sortie
(nous allons maintenant lire ce fichier)
fichiers - suite¶
# à l'envers, on relit le fichier
with open('tutu.txt') as reader:
for line in reader:
print(line, end="")
i=0
i=1
i=2
i=3
sans préciser le mode d’ouverture
open
ouvre le fichier en lecture
l’objet reader
est itérable
la variable line
contient une fin de ligne
pas besoin que print
en rajoute une
exercice¶
écrire une fonction json_random()
qui retourne :
une chaine de caractères
qui correspond à l’encodage en JSON
d’une liste contenant - au hasard - entre 2 et 5 valeurs numériques
elles-mêmes tirées au hasard dans l’intervalle $[2 .. 5]$
# n'oubliez pas d'importer les modules
# dont vous avez besoin
def random_json():
"""
returns a JSON-encoded of a list
of 2 to 5 values between 2 and 5
"""
# votre code ici
pass
from check_random_json import check_random_json
check_random_json(random_json)
ERROR:root:result None is not a str
ERROR:root:nope, try again