Modules, tests, boucles, fonctions

Les fonctions permettent de généraliser des instructions. Il s’agit ainsi d’un outil privilégié pour automatiser des tâches répétitives ou réduire la complexité d’une chaîne de traitement. Elles sont donc à utiliser sans modération. Ce chapitre présente quelques rappels sur le sujet.

Tutoriel
Rappels
Author

Lino Galiana

Published

2024-04-27

1 Utilisation d’un module installé

Python, comme R, sont des langages construits sur le principe de briques. Ces briques sont ce qu’on appelle des packages.

Au contraire de Stata mais comme pour R, il faut toujours préciser les packages que vous utilisez au début du code, sinon Python ne reconnait pas les fonctions appelées.

1.1 Import module

On charge un module grâce à la commande import. Pour chaque code que vous exécutez, il faut charger les modules en introduction.

Une fois qu’on a chargé le module, on peut faire appel aux commandes qui en dépendent en les appelant après avoir tapé le nom du module. Si vous ne précisez pas le nom du module avant celui de la fonction, il ne la trouvera pas forcément.

Voici un exemple avec le module numpy qui est très courant et permet de faire des calculs matriciels sous Python.

import numpy

print(numpy.arange(5))
[0 1 2 3 4]

1.2 Import module as md - donner un nom au module

On peut aussi donner un pseudonyme au module pour éviter de taper un nom trop long à chaque fois qu’on utilise une fonction.

Classiquement le nom raccourci de numpy est np, celui de pandas est pd.

import pandas as pd
import numpy as np

small_array = np.array([[1, 2], [3, 4]])
data = pd.DataFrame(small_array)
data.head()
0 1
0 1 2
1 3 4

1.3 from Module Import fonction - seulement une partie du module

Si on ne veut pas être obligé de donner le nom du module avant d’appeler la fonction, il y a toujours la possibilité de n’importer qu’une fonction du module. Dans le cas de l’exemple, Python sait que la fonction arrange est celle de numpy.

Mais attention : si deux fonctions de modules différents ont le même nom, c’est toujours la dernière importée qui gagne.

On voit souvent from _module_ import *. C’est-à-dire qu’on importe toutes les fonctions du module mais on n’a pas besoin de spécifier le nom du module avant les méthodes.

from numpy import array

print(array(5))
5

2 Les tests

Les tests permettent d’exécuter telle ou telle instruction selon la valeur d’une condition.

Pour faire un test avec un bloc d’instructions, il faut toujours :

  • que l’expression à vérifier soit suivie de :
  • que le bloc d’instruction soit forcément indenté

2.1 Test avec contrepartie : if et else

Comme dans les autres langages, on teste une condition. Si elle est vérifiée, alors une instruction suit et sinon, une autre instruction est exécutée.

Il est conseillé de toujours indiquer une contrepartie afin d’éviter les surprises.

2.1.1 Test d’une égalité ou inégalité

x = 6

if x > 5:
    print("x est plus grand que 5")
else:  # la contrepartie si la condition if n'est pas réalisée
    print("x est plus petit que 5")
x est plus grand que 5

2.1.2 Test dans un intervalle

# on peut avoir des intervalles directement
x = 6
if 5 < x < 10:
    print("x est entre 5 et 10")
else:
    print("x est plus grand que 10")
x est entre 5 et 10
# tester plusieurs valeurs avec l'opérateur logique "or"
x = 5
if x == 5 or x == 10:
    print("x vaut 5 ou 10")
else:
    print("x est différent de 5 et 10")
x vaut 5 ou 10

2.2 Tests successifs : if, elif et else

Avec if et elif, dès qu’on rencontre une condition qui est réalisée, on n’en cherche pas d’autres potentiellement vérifiées. Plusieurs if à la suite peuvent quant à eux être vérifiés. Suivant ce que vous souhaitez faire, les opérateurs ne sont pas substituables.

Notez la différence entre ces deux bouts de code :

# code 1
x = 5

if x != 10:
    print("x ne vaut pas 10")
elif x >= 5:
    print("x est égal ou supérieur à 5")
x ne vaut pas 10

Dans le cas de elif, on s’arrête à la première condition vérifiée et dans le cas suivant, on continue à chaque condition vérifiée

# code 2
x = 5

if x != 10:
    print("x ne vaut pas 10")
if x >= 5:
    print("x est égal ou supérieur à 5")
x ne vaut pas 10
x est égal ou supérieur à 5

3 Boucles

Il existe deux types de boucles : les boucles for et les boucles while

La boucle for parcourt un ensemble, tandis que la boucle while continue tant qu’une condition est vraie.

3.1 Boucle for

3.1.1 Parcourir une liste croissantes d’entiers

# parcourt les entiers de 0 à n-1 inclus
for i in range(0, 3):
    print(i)
0
1
2

3.1.2 Parcourir une liste décroissante d’entiers

# parcourt les entiers de 3 à n+1 inclus
for i in range(3, 0, -1):
    print(i)
3
2
1

3.1.3 Parcourir une liste de chaines de caractères

On va faire une boucle sur les éléments d’une liste

3.1.4 Boucle sur les éléments d’une liste

liste_elements = ["Nicolas", "Romain", "Florimond"]

# pour avoir l'ensemble des éléments de la liste
for item in liste_elements:
    print(item)
Nicolas
Romain
Florimond

3.1.5 Boucle sur les éléments d’une liste dans une autre liste

# pour avoir la place des éléments de la première liste dans la seconde liste

liste_globale = ["Violette", "Nicolas", "Mathilde", "Romain", "Florimond", "Helene"]

for item in liste_elements:
    print(item, liste_globale.index(item))
Nicolas 1
Romain 3
Florimond 4

3.2 Bonus : les list comprehension

Avec les listes, il existe aussi un moyen très élégant de condenser son code pour éviter de faire apparaitre des boucles sans arrêt. Comme les boucles doivent etre indentées, le code peut rapidement devenir illisible.

Grace aux list comprehension, vous pouvez en une ligne faire ce qu’une boucle vous permettait de faire en 3 lignes.

Par exemple, imaginez que vous vouliez faire la liste de toutes les lettres contenues dans un mot, avec un boucle vous devrez d’abord créer une liste vide, puis ajouter à cette liste toutes les lettres en question avec un .append()

liste_lettres = []

for lettre in "ENSAE":
    liste_lettres.append(lettre)

print(liste_lettres)
['E', 'N', 'S', 'A', 'E']

avec une list comprehension, on condense la syntaxe de la manière suivante :

h_letters = [letter for letter in "ENSAE"]
print(h_letters)
['E', 'N', 'S', 'A', 'E']

Avec une list comprehension

[expression for item in list if conditional]

est équivalent à

for item in list:
    if conditional:
        expression

3.2.1 Mise en application

Mettez sous forme de list comprehension le bout de code suivant

squares = []

for x in range(10):
    squares.append(x**2)
print(squares)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

3.3 Boucle while

Le bloc d’instruction d’une boucle while est exécuté tant que la condition est vérifiée.

Le piège de ces boucles : la boucle while infinie ! Il faut toujours vérifier que votre boucle s’arrêtera un jour, il faut qu’à un moment ou à un autre, il y ait un élément qui s’incrémente ou qui soit modifié.

x = 10
y = 8
# tant que y est plus petit que 10, je continue de lui ajouter 1
while y <= x:
    print("y n'est pas encore plus grand que x")
    y += 1  # l'incrément
else:
    print("y est plus grand que x et vaut", y)
y n'est pas encore plus grand que x
y n'est pas encore plus grand que x
y n'est pas encore plus grand que x
y est plus grand que x et vaut 11

3.4 Break et continue

Dans les boucles for ou while on peut avoir besoin d’ignorer ou de ne pas effectuer certaines itérations. 2 instructions utiles :

  • l’instruction break : permet de sortir de la boucle
  • l’instruction continue : permet de passer à l’itération suivante sans exécuter les instructions qui suivent
# utilisation de break
for x in range(5):
    if x == 2:
        break
    else:
        print(x)
0
1
# utilisation de continue
for x in range(5):
    if x == 2:
        continue
    else:
        print(x)
0
1
3
4

4 Créer ses fonctions

Les fonctions permettent de faire la même chose sans avoir à recopier le code plusieurs fois dans le même programme. Dès que vous le pouvez, faites des fonctions : le copier-coller est trop dangereux.

  • Elles peuvent prendre plusieurs paramètres (ou aucun) elles peuvent retourner plusieurs résultats (ou aucun)
  • Pour mettre une aide à la fonction, on écrit au début entre ““” ““” (en rouge dans l’exemple)
# 1er exemple de fonction


def ma_fonction_increment(parametre):
    """Cette fonction ajoute 1 au paramètre qu'on lui donne"""
    x = parametre + 1
    return x


# pour documenter la fonction, on écrit son aide
help(ma_fonction_increment)
Help on function ma_fonction_increment in module __main__:

ma_fonction_increment(parametre)
    Cette fonction ajoute 1 au paramètre qu'on lui donne

On peut également :

  • avoir des paramètres facultatifs, mais ils doivent toujours être placés à la fin des paramètres
  • en cas de paramètre facultatif, il faut lui donner une valeur par défaut
  • retourner plus d’un élément à la fin d’une fonction
  • avoir des paramètres de tailles différentes
def ma_fonction(p, q=2):
    y1 = p + q
    y2 = y1 % 3  # reste de la division euclidienne
    return y1, y2


x = ma_fonction(11)
# ici, on n'a pas de 2nd paramètre
# , par défaut, x = ma_fonction(10,2)
print("x=", x)

z = ma_fonction(10, -1)
print("z =", z)
x= (13, 1)
z = (9, 0)

Une fonction peut également s’appeler elle même : c’est ce qu’on appelle une fonction récursive.

Dans cet exemple, somme_recursion() est une fonction que nous avons définie de sorte à ce qu’elle s’appelle elle-même (récursif).

On utilise l’argument k, qui décroit (-1) chaque fois qu’on fait appel à la fonction.

La récursion s’arrête quand k est nul. Dans cet exemple, on va donc appeler 6 fois la fonction récursive.

def somme_recursion(k):
    if k > 0:
        result = k + somme_recursion(k - 1)
        print(k, result)
    else:
        result = 0
    return result


somme_recursion(6)
1 1
2 3
3 6
4 10
5 15
6 21
21

Les fonctions sont très utiles et nous vous invitons à les utiliser dès que vous le pouvez car elles permettent d’avoir un code clair et structuré, plutôt que des bouts de code éparpillés.

5 Lever des exceptions

Python peut rencontrer des erreurs en exécutant votre programme.

Ces erreurs peuvent être interceptées très facilement et c’est même, dans certains cas, indispensable. Par exemple, si vous voulez faire une boucle mais que vous savez que l’instruction ne marchera pas toujours : au lieu de lister les cas où une opération n’est pas possible, on peut indiquer directement quelle erreur doit être ignorée.

Cependant, il ne faut pas tout intercepter non plus : si Python envoie une erreur, c’est qu’il y a une raison. Si vous ignorez une erreur, vous risquez d’avoir des résultats très étranges dans votre programme.

# éviter une division par 0, c'est une bonne idée :


def inverse(x):
    """Cette fonction renvoie l inverse de l argument"""
    y = 1 / x
    return y


div = inverse(0)
ZeroDivisionError: division by zero

L’erreur est écrite noir sur blanc : ZeroDivisionError

Dans l’idéal on aimerait éviter que notre code bloque sur ce problème. On pourrait passer par un test if et vérifier que x est différent de 0. Mais on se rend vite compte que dans certains cas, on ne peut lister tous les tests en fonction de valeurs.

Alors on va lui précisier ce qu’il doit faire en fonction de l’erreur retournée.

Try : 
    instruction
except TypeErreur :
    autre instruction

Par exemple,

def inverse(x):
    try:
        y = 1 / x
    except ZeroDivisionError:
        y = None
    return y


print(inverse(10))
print(inverse(0))
0.1
None

Il est recommandé de toujours préciser le type d’erreur qu’on rencontre. Si on met uniquement “except” sans préciser le type, on peut passer à côté d’erreurs pour lesquelles la solution n’est pas universelle.

6 A retenir et questions

6.1 A retenir

  • Toujours mettre “:” avant un bloc d’instructions
  • Indenter avant un bloc d’instructions (avec 4 espaces et non une tabulation !)
  • Indiquer les modules nécessaires à l’exécution en début de code
  • Documenter les fonctions créées
  • Préciser le type d’erreur pour les exceptions et potentiellement différencier les blocs d’instructions en fonction de l’erreur

6.2 Questions

  • Que fait ce programme ?
def inverse(x):
    try:
        y = 1 / x
    except ZeroDivisionError:
        y = None
        return y
  • Ecrivez un programme qui peut trouver tous les nombres divisibles par 7 et non multiples de 5 entre 6523 et 8463 (inclus)

  • Ecrivez un programme qui prend une phrase en entrée et qui calcule le nombre de voyelles en Majuscules et de consonnes en minuscules :

    • phrase = “Vous savez, moi je ne crois pas qu’il y ait de bonne ou de mauvaise situation. Moi, si je devais résumer ma vie aujourd’hui avec vous, je dirais que c’est d’abord des rencontres. Des gens qui m’ont tendu la main, peut-être à un moment où je ne pouvais pas, où j’étais seul chez moi. Et c’est assez curieux de se dire que les hasards, les rencontres forgent une destinée… Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l’interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n’est pas mon cas, comme je disais là, puisque moi au contraire, j’ai pu : et je dis merci à la vie, je lui dis merci, je chante la vie, je danse la vie… je ne suis qu’amour ! Et finalement, quand beaucoup de gens aujourd’hui me disent ‘Mais comment fais-tu pour avoir cette humanité ?’, et bien je leur réponds très simplement, je leur dis que c’est ce goût de l’amour ce goût donc qui m’a poussé aujourd’hui à entreprendre une construction mécanique, mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi…”

Informations additionnelles

environment files have been tested on.

Latest built version: 2024-04-27

Python version used:

'3.11.6 | packaged by conda-forge | (main, Oct  3 2023, 10:40:35) [GCC 12.3.0]'
Package Version
affine 2.4.0
aiobotocore 2.12.2
aiohttp 3.9.3
aioitertools 0.11.0
aiosignal 1.3.1
alembic 1.13.1
aniso8601 9.0.1
annotated-types 0.6.0
appdirs 1.4.4
archspec 0.2.3
astroid 3.1.0
asttokens 2.4.1
attrs 23.2.0
Babel 2.14.0
bcrypt 4.1.2
beautifulsoup4 4.12.3
black 24.4.2
blinker 1.7.0
blis 0.7.11
bokeh 3.4.0
boltons 23.1.1
boto3 1.34.51
botocore 1.34.51
branca 0.7.1
Brotli 1.1.0
cachetools 5.3.3
cartiflette 0.0.2
Cartopy 0.23.0
catalogue 2.0.10
cattrs 23.2.3
certifi 2024.2.2
cffi 1.16.0
charset-normalizer 3.3.2
click 8.1.7
click-plugins 1.1.1
cligj 0.7.2
cloudpathlib 0.16.0
cloudpickle 3.0.0
colorama 0.4.6
comm 0.2.2
commonmark 0.9.1
conda 24.3.0
conda-libmamba-solver 24.1.0
conda-package-handling 2.2.0
conda_package_streaming 0.9.0
confection 0.1.4
contextily 1.6.0
contourpy 1.2.1
cryptography 42.0.5
cycler 0.12.1
cymem 2.0.8
cytoolz 0.12.3
dask 2024.4.1
dask-expr 1.0.10
debugpy 1.8.1
decorator 5.1.1
dill 0.3.8
distributed 2024.4.1
distro 1.9.0
docker 7.0.0
duckdb 0.10.1
en-core-web-sm 3.7.1
entrypoints 0.4
et-xmlfile 1.1.0
exceptiongroup 1.2.0
executing 2.0.1
fastjsonschema 2.19.1
fiona 1.9.6
flake8 7.0.0
Flask 3.0.2
folium 0.16.0
fontawesomefree 6.5.1
fonttools 4.51.0
frozenlist 1.4.1
fsspec 2023.12.2
GDAL 3.8.4
gensim 4.3.2
geographiclib 2.0
geopandas 0.12.2
geoplot 0.5.1
geopy 2.4.1
gitdb 4.0.11
GitPython 3.1.43
google-auth 2.29.0
graphene 3.3
graphql-core 3.2.3
graphql-relay 3.2.0
graphviz 0.20.3
great-tables 0.5.0
greenlet 3.0.3
gunicorn 21.2.0
htmltools 0.5.1
hvac 2.1.0
idna 3.6
imageio 2.34.1
importlib_metadata 7.1.0
importlib_resources 6.4.0
inflate64 1.0.0
ipykernel 6.29.3
ipython 8.22.2
ipywidgets 8.1.2
isort 5.13.2
itsdangerous 2.1.2
jedi 0.19.1
Jinja2 3.1.3
jmespath 1.0.1
joblib 1.3.2
jsonpatch 1.33
jsonpointer 2.4
jsonschema 4.21.1
jsonschema-specifications 2023.12.1
jupyter-cache 1.0.0
jupyter_client 8.6.1
jupyter_core 5.7.2
jupyterlab_widgets 3.0.10
kaleido 0.2.1
kiwisolver 1.4.5
kubernetes 29.0.0
langcodes 3.4.0
language_data 1.2.0
lazy_loader 0.4
libmambapy 1.5.7
llvmlite 0.42.0
locket 1.0.0
lxml 5.2.1
lz4 4.3.3
Mako 1.3.2
mamba 1.5.7
mapclassify 2.6.1
marisa-trie 1.1.0
Markdown 3.6
MarkupSafe 2.1.5
matplotlib 3.8.3
matplotlib-inline 0.1.6
mccabe 0.7.0
menuinst 2.0.2
mercantile 1.2.1
mizani 0.11.2
mlflow 2.11.3
mlflow-skinny 2.11.3
msgpack 1.0.7
multidict 6.0.5
multivolumefile 0.2.3
munkres 1.1.4
murmurhash 1.0.10
mypy 1.9.0
mypy-extensions 1.0.0
nbclient 0.10.0
nbformat 5.10.4
nest_asyncio 1.6.0
networkx 3.3
nltk 3.8.1
numba 0.59.1
numpy 1.26.4
oauthlib 3.2.2
opencv-python-headless 4.9.0.80
openpyxl 3.1.2
OWSLib 0.28.1
packaging 23.2
pandas 2.2.1
paramiko 3.4.0
parso 0.8.4
partd 1.4.1
pathspec 0.12.1
patsy 0.5.6
Pebble 5.0.7
pexpect 4.9.0
pickleshare 0.7.5
pillow 10.3.0
pip 24.0
pkgutil_resolve_name 1.3.10
platformdirs 4.2.0
plotly 5.19.0
plotnine 0.13.5
pluggy 1.4.0
polars 0.20.18
preshed 3.0.9
prometheus_client 0.20.0
prometheus-flask-exporter 0.23.0
prompt-toolkit 3.0.42
protobuf 4.25.3
psutil 5.9.8
ptyprocess 0.7.0
pure-eval 0.2.2
py7zr 0.20.8
pyarrow 15.0.0
pyarrow-hotfix 0.6
pyasn1 0.5.1
pyasn1-modules 0.3.0
pybcj 1.0.2
pycodestyle 2.11.1
pycosat 0.6.6
pycparser 2.21
pycryptodomex 3.20.0
pydantic 2.7.1
pydantic_core 2.18.2
pyflakes 3.2.0
Pygments 2.17.2
PyJWT 2.8.0
pylint 3.1.0
PyNaCl 1.5.0
pynsee 0.1.7
pyOpenSSL 24.0.0
pyparsing 3.1.2
pyppmd 1.1.0
pyproj 3.6.1
pyshp 2.3.1
PySocks 1.7.1
python-dateutil 2.9.0
python-dotenv 1.0.1
python-magic 0.4.27
pytz 2024.1
pyu2f 0.1.5
pywaffle 1.1.0
PyYAML 6.0.1
pyzmq 25.1.2
pyzstd 0.15.10
QtPy 2.4.1
querystring-parser 1.2.4
rasterio 1.3.10
referencing 0.34.0
regex 2023.12.25
requests 2.31.0
requests-cache 1.2.0
requests-oauthlib 2.0.0
rpds-py 0.18.0
rsa 4.9
Rtree 1.2.0
ruamel.yaml 0.18.6
ruamel.yaml.clib 0.2.8
s3fs 2023.12.2
s3transfer 0.10.1
scikit-image 0.23.2
scikit-learn 1.4.1.post1
scipy 1.13.0
seaborn 0.13.2
setuptools 69.2.0
shapely 2.0.3
six 1.16.0
smart-open 6.4.0
smmap 5.0.0
snuggs 1.4.7
sortedcontainers 2.4.0
soupsieve 2.5
spacy 3.7.4
spacy-legacy 3.0.12
spacy-loggers 1.0.5
SQLAlchemy 2.0.29
sqlparse 0.4.4
srsly 2.4.8
stack-data 0.6.2
statsmodels 0.14.1
tabulate 0.9.0
tblib 3.0.0
tenacity 8.2.3
texttable 1.7.0
thinc 8.2.3
threadpoolctl 3.4.0
tifffile 2024.4.24
tomli 2.0.1
tomlkit 0.12.4
toolz 0.12.1
topojson 1.8
tornado 6.4
tqdm 4.66.2
traitlets 5.14.2
truststore 0.8.0
typer 0.9.4
typing_extensions 4.11.0
tzdata 2024.1
Unidecode 1.3.8
url-normalize 1.4.3
urllib3 1.26.18
wasabi 1.1.2
wcwidth 0.2.13
weasel 0.3.4
webcolors 1.13
webdriver-manager 4.0.1
websocket-client 1.7.0
Werkzeug 3.0.2
wheel 0.43.0
widgetsnbextension 4.0.10
wordcloud 1.9.3
wrapt 1.16.0
xgboost 2.0.3
xlrd 2.0.1
xyzservices 2024.4.0
yarl 1.9.4
yellowbrick 1.5
zict 3.0.0
zipp 3.17.0
zstandard 0.22.0

View file history

SHA Date Author Description
c9f9f8a 2024-04-24 15:09:35 Lino Galiana Dark mode and CSS improvements (#494)
d75641d 2024-04-22 18:59:01 Lino Galiana Editorialisation des chapitres de manipulation de données (#491)
005d89b 2023-12-20 17:23:04 Lino Galiana Finalise l’affichage des statistiques Git (#478)
4c1c22d 2023-12-10 11:50:56 Lino Galiana Badge en javascript plutôt (#469)
9366e8d 2023-10-09 12:06:23 Lino Galiana Retrait des box hugo sur l’exo git (#428)
e8d0062 2023-09-26 15:54:49 Kim A Relecture KA 25/09/2023 (#412)
3bdf3b0 2023-08-25 11:23:02 Lino Galiana Simplification de la structure 🤓 (#393)
78ea2cb 2023-07-20 20:27:31 Lino Galiana Change titles levels (#381)
2dbf853 2023-07-05 11:21:40 Lino Galiana Add nice featured images (#368)
b2d4823 2022-09-21 17:36:29 Lino Galiana Relec KA 21/09 (#273)
f10815b 2022-08-25 16:00:03 Lino Galiana Notebooks should now look more beautiful (#260)
d201e3c 2022-08-03 15:50:34 Lino Galiana Pimp la homepage ✨ (#249)
12965ba 2022-05-25 15:53:27 Lino Galiana :launch: Bascule vers quarto (#226)
9c71d6e 2022-03-08 10:34:26 Lino Galiana Plus d’éléments sur S3 (#218)
f95b174 2021-11-03 12:08:34 Lino Galiana Enrichi la section sur la gestion des dépendances (#175)
6777f03 2021-10-29 09:38:09 Lino Galiana Notebooks corrections (#171)
2a8809f 2021-10-27 12:05:34 Lino Galiana Simplification des hooks pour gagner en flexibilité et clarté (#166)
2fa78c9 2021-09-27 11:24:19 Lino Galiana Relecture de la partie numpy/pandas (#152)
a1b8aaf 2021-09-20 09:05:55 Lino Galiana Badges de telechargement dans les premiers TP (#146)
85ba119 2021-09-16 11:27:56 Lino Galiana Relectures des TP KA avant 1er cours (#142)
aeb3995 2021-07-06 11:11:03 avouacr Relecture et ajouts sur anaconda + jupyter (#116)
4cdb759 2021-05-12 10:37:23 Lino Galiana :sparkles: :star2: Nouveau thème hugo :snake: :fire: (#105)
18be8f4 2020-10-01 17:08:53 Lino Galiana Intégration de box inspirées du thème pydata sphinx (#58)
c3c7433 2020-09-15 12:41:26 Lino Galiana Improve CI with gitlab and jupyter nb conversion (#35)
913047d 2020-09-08 14:44:41 Lino Galiana Harmonisation des niveaux de titre (#17)
56f8532 2020-09-08 10:40:03 Lino Galiana Reprise des éléments de la première séance dans le site web (#14)
Back to top

Citation

BibTeX citation:
@book{galiana2023,
  author = {Galiana, Lino},
  title = {Python Pour La Data Science},
  date = {2023},
  url = {https://pythonds.linogaliana.fr/},
  doi = {10.5281/zenodo.8229676},
  langid = {en}
}
For attribution, please cite this work as:
Galiana, Lino. 2023. Python Pour La Data Science. https://doi.org/10.5281/zenodo.8229676.