Update first chapters and new questions
Updated first chapter slides. Added new questions in the new training section.
This commit is contained in:
@ -7,8 +7,9 @@ author: Steve Kossouho
|
||||
|
||||
----
|
||||
|
||||
En Python, on peut écrire des choses simples avec un seul script. Mais
|
||||
souvent, et même pour des choses simples, on peut se retrouver à écrire du code, organisé de façon un peu plus complexe, ou même du code qui réutilise des fonctionnalités en dehors de votre script.
|
||||
En Python, on peut écrire des choses simples qui tiennent dans un seul fichier de script.
|
||||
Souvent, les projets plus ambitieux écrivent du code organisé de façon un peu plus complexe,
|
||||
ou encore du code qui réemploie des fonctionnalités décrites dans des scripts externes.
|
||||
|
||||
----
|
||||
|
||||
@ -16,7 +17,9 @@ souvent, et même pour des choses simples, on peut se retrouver à écrire du co
|
||||
|
||||
Jusque là, tout ce que nous avons écrit, c'est des [modules]{.naming}. Ce sont des fichiers .py (vides ou non, ils peuvent contenir du code).
|
||||
|
||||
Il existe aussi les [packages]{.naming}. Ce sont des répertoires, pouvant contenir d'autres modules, et qui sont utilisables comme des modules (peuvent contenir du code). Pour pouvoir associer du code à ces répertoires et les considérer comme des packages, le langage Python impose que le code associé repose dans un fichier nommé `__init__.py` dans le répertoire. L'intérêt principal d'un package est d'y ranger d'autres packages et modules, pour organiser son code en arborescence cohérente.
|
||||
Il existe aussi les [packages]{.naming}. Ce sont des répertoires, pouvant contenir d'autres modules, et qui sont utilisables comme des modules (peuvent contenir du code).
|
||||
Pour pouvoir associer du code à ces répertoires et les considérer comme des packages, la spécification du langage Python impose que le code associé repose dans un
|
||||
fichier nommé `__init__.py` dans le répertoire. L'intérêt principal d'un package est d'y ranger d'autres packages et modules, pour organiser son code en arborescence cohérente.
|
||||
|
||||
----
|
||||
|
||||
@ -24,9 +27,10 @@ Il existe aussi les [packages]{.naming}. Ce sont des répertoires, pouvant conte
|
||||
|
||||
Les modules et packages ont la même typographie que les variables (car Python les traite comme des variables de type `module`) :
|
||||
|
||||
- Tout en minuscules (ex. `mypackage`)
|
||||
- <span style="color:red;">Sans espace ni tiret</span> (ex. `my_package`)
|
||||
- etc.
|
||||
- Tout en minuscules (ex. `my_package`)
|
||||
- Sans espace ni tiret (ex. `super_package`). Un module contenant un espace n'est pas réutilisable.
|
||||
- Aucun caractère accentué (ex. `derogations_generiques`)
|
||||
- Peut contenir des chiffres, mais doit commencer par une lettre.
|
||||
|
||||
|
||||
----
|
||||
@ -37,87 +41,135 @@ Python est à la fois un langage et un exécutable interprétant des scripts éc
|
||||
L'interpréteur est toujours livré avec ce qu'on appelle la bibliothèque standard.
|
||||
Il s'agit d'une immense bibliothèque de fonctionnalités, que l'on peut réutiliser dans nos programmes.
|
||||
|
||||
La bibliothèque propose des outils pour manipuler du texte, du réseau, des bases de données, des fonctions mathématiques etc.
|
||||
La bibliothèque propose des outils pour manipuler du texte, du réseau, des bases de données, des fonctions mathématiques, etc.
|
||||
|
||||
[Liste des modules et packages de la bibliothèque standard](https://docs.python.org/3/library/)
|
||||
|
||||
----
|
||||
|
||||
Parmi les très nombreux modules de la bibliothèque standard, assez peu vous serviront régulièrement. En voici une liste :
|
||||
### Modules utiles
|
||||
|
||||
Parmi les très nombreux modules (environ `220`) de la bibliothèque standard, assez peu vous serviront régulièrement.
|
||||
En voici une liste :
|
||||
|
||||
- `random` : génération de nombres aléatoires
|
||||
- `math` : fonctions mathématiques et trigonométriques
|
||||
- `statistics` : fonctions statistiques, comme l'écart type.
|
||||
- `math` : fonctions arithmétiques, logarithmiques et trigonométriques
|
||||
- `statistics` : fonctions statistiques de base, comme l'écart type.
|
||||
- `pathlib` : outils pour gérer les chemins de fichier
|
||||
- `datetime` : types pour gérer les dates
|
||||
- `re` : pour gérer des expressions régulières (compatibles _Perl_)
|
||||
|
||||
D'autres peuvent servir ponctuellement, comme `csv` ou `sqlite3` pour nos exemples à venir.
|
||||
|
||||
----
|
||||
|
||||
Comment accéder à ces nombreuses fonctionnalités ?
|
||||
Par défaut, elles ne sont pas toutes accessibles dans votre code, excepté celles documentées dans les sections "built-in", et pour pouvoir les utiliser, il faut en faire la demande explicite dans vos modules via la notion d'`import` :
|
||||
### Importer des fonctionnalités
|
||||
|
||||
Variantes :
|
||||
Par défaut, seules les fonctionnalités documentées dans les sections natives (`builtins`) sont directement utilisables,
|
||||
et pour pouvoir utiliser les autres fonctionnalités, il faut en faire la demande explicite dans votre code via la notion d'`import` :
|
||||
|
||||
```{.python .numberLines}
|
||||
# Les imports sont écrits au sommet d'un module
|
||||
import math # vous avez maintenant une variable nommée `math`
|
||||
from os import path # vous avez une variable `path`
|
||||
```python {.numberLines}
|
||||
import math # importe le module math via une variable
|
||||
from os import path # importe le module path du package os
|
||||
from os.path import basename # importe directement basename depuis os.path
|
||||
from math import sin, cos # importer plusieurs fonctions depuis math
|
||||
import datetime as dt # datetime est utilisable en tant que dt uniquement
|
||||
|
||||
from math import sin, cos # importer plusieurs fonctions de la même bibliothèque
|
||||
|
||||
math.cos(math.pi / 2.0) # possible grâce à import math
|
||||
cos(0) # possible grâce à from math import cos
|
||||
path.join(…)
|
||||
print(math.cos(math.pi / 2.0)) # utilise uniquement l'import de math
|
||||
print(cos(math.pi / 2.0), sin(math.pi / 2.0)) # utilise l'import de sin et cos
|
||||
print(path.basename("/chemin/de/fichier/linux.txt")) # utilise l'import de path
|
||||
print(basename("/chemin/de/fichier/linux.txt")) # utilise l'import de basename
|
||||
print(dt.date.today())
|
||||
```
|
||||
|
||||
Chaque script qui utilise directement un _symbole_ doit toujours l'importer.
|
||||
Chaque script qui référence directement un objet provenant d'une bibliothèque doit toujours l'importer.
|
||||
|
||||
**Note** : Pour importer le contenu d'un module, l'interpréteur Python doit toujours exécuter le contenu dudit module, afin d'en connaître le contenu. Attention donc à la présence de `print` dans ledit module.
|
||||
**Note** : Pour importer le contenu d'un module ou un élément d'un module, l'interpréteur Python doit toujours
|
||||
exécuter le contenu dudit module, afin d'en connaître le contenu.
|
||||
|
||||
----
|
||||
|
||||
Note : Normalement, importer un package donne accès uniquement aux variables directement définies dans celui-ci, mais pas
|
||||
aux sous-modules ou packages qui s'y trouvent. Si vous créez un package `package` contenant un sous-module `module1` :
|
||||
|
||||
```{.python .numberLines}
|
||||
import package
|
||||
|
||||
print(package.module1) # ceci provoque une erreur
|
||||
```
|
||||
|
||||
Cela ne fonctionne pas car Python ne charge pas directement les modules et packages présents à l'intérieur du package.
|
||||
Pour y avoir accès, il faut que le package lui-même importe les éléments qui seront directement accessibles depuis celui-ci :
|
||||
|
||||
```{.python .numberLines}
|
||||
from . import module1 # ajoute une variable module1 dans le package
|
||||
```
|
||||
`package/__init__.py`
|
||||
|
||||
----
|
||||
|
||||
## Faire un petit peu de calcul avec la bibliothèque standard
|
||||
## Un peu de calcul avec la bibliothèque standard
|
||||
|
||||
Avec l'outil que sont les imports, on peut avoir accès à de nombreuses fonctions de calcul.
|
||||
Par exemple, on pourrait générer un nombre aléatoire et calculer un cosinus :
|
||||
|
||||
```{.python .numberLines}
|
||||
```python {.numberLines}
|
||||
import random
|
||||
import math
|
||||
|
||||
random_number = random.randint(0, 100) # nombre entre 0 et 100 inclus
|
||||
cosinus_result = math.cos(random_number) # cosinus du nombre aléatoire
|
||||
number = random.randint(0, 100) # nombre entre 0 et 100 inclus
|
||||
cosinus_result = math.cos(number) # cosinus du nombre aléatoire
|
||||
|
||||
while True:
|
||||
try:
|
||||
guess = int(input("Saisissez un nombre entre 0 et 100 : "))
|
||||
# Les lignes suivantes s'exécuteront si la ligne du dessus ne génère pas d'erreur
|
||||
if guess < number:
|
||||
print("C'est supérieur.")
|
||||
elif guess > number:
|
||||
print("C'est inférieur.")
|
||||
else:
|
||||
print("C'est gagné !")
|
||||
break # Quitter la boucle
|
||||
except ValueError: # si impossible de récupérer l'équivalent entier
|
||||
print("Saisie incorrecte.")
|
||||
```
|
||||
|
||||
- [Documentation du module `random`](https://docs.python.org/3/library/random.html)
|
||||
- [Documentation du module `math`](https://docs.python.org/3/library/math.html)
|
||||
|
||||
----
|
||||
|
||||
## Bonus : Installer des paquets externes ([PyPI](https://pypi.org))
|
||||
## Extra : Installer des paquets externes ([PyPI](https://pypi.org))
|
||||
|
||||
Avec PyCharm, on va installer simplement quelques paquets externes et utiliser leurs fonctionnalités :
|
||||
Avec PyCharm, on peut installer simplement quelques paquets externes et utiliser leurs fonctionnalités :
|
||||
|
||||
1. `requests` : Faire des requêtes HTTP plus simplement
|
||||
1. `requests` : Faire des requêtes HTTP et consommer des API REST
|
||||
2. `unidecode` : Translittération et désaccentuation
|
||||
3. `attrs` : Accélérer l'écriture de classes
|
||||
3. `faker` : Anonymiser avec des données factices (noms, adresses, téléphone, code pin, etc.)
|
||||
|
||||
----
|
||||
|
||||
### Gérer un environnement virtuel pour installer des bibliothèques
|
||||
|
||||
Python est livré avec un outil en ligne de commande nommé `pip`, qui vous permet facilement de télécharger et
|
||||
installer des bibliothèques externes publiées sur le site [PyPI](https://pypi.org).
|
||||
|
||||
Si pour votre projet, vous avez besoin de la dernière version de la bibliothèque `requests`, par exemple, vous pouvez l'installer
|
||||
avec la commande suivante dans un terminal :
|
||||
|
||||
```sh {.numberLines}
|
||||
pip install requests
|
||||
```
|
||||
|
||||
La dernière version de la bibliothèque compatible avec votre version de Python sera installée dans un répertoire spécifique
|
||||
avec le nom `requests`. Vous ne pouvez pas installer plusieurs versions simultanées de la même bibliothèque au même endroit.
|
||||
|
||||
----
|
||||
|
||||
### Les environnements virtuels pour gérer ses versions de paquets
|
||||
|
||||
Un environnement virtuel (`venv`) se présente sous la forme d'un répertoire avec quelques scripts, dont `python`. Lorsqu'un environnement
|
||||
virtuel est "activé" via l'un de ses scripts, il se passe plusieurs choses :
|
||||
|
||||
- Les bibliothèques installées avec `pip` sont installées dans cet environnement virtuel
|
||||
- L'exécutable `python` de l'environnement peut importer les bibliothèques installées dans ce dernier
|
||||
|
||||
L'intérêt est de pouvoir facilement gérer plusieurs projets qui nécessitent des versions différentes des mêmes
|
||||
bibliothèques.
|
||||
|
||||
Les environnements virtuels peuvent être créés, sélectionnés, et utilisés automatiquement avec Visual Studio Code
|
||||
et PyCharm.
|
||||
|
||||
----
|
||||
|
||||
#### PyCharm
|
||||
|
||||
TODO
|
||||
|
||||
----
|
||||
|
||||
#### Visual Studio Code
|
||||
|
||||
TODO
|
||||
|
Reference in New Issue
Block a user