Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
dev:python:start [2014/11/17 13:26] – root | dev:python:start [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Python ====== | + | {{tag> |
- | Quelques notes à propos des spécificités du langage Python. | + | ====== Python: introduction ====== |
+ | |||
+ | Quelques notes à propos des spécificités du langage Python | ||
+ | |||
+ | Python a été conçu avec l' | ||
+ | |||
+ | Langage portable avec une grosse base de code: calcul scientifique, | ||
+ | |||
+ | Python permet de devélopper/ | ||
+ | * types de base puissants (listes, dictionnaires, | ||
+ | * gestion automatique de la mémoire | ||
+ | * langage interprété et EDI divers (notebooks IDLE etc) | ||
+ | |||
+ | ===== Droits et licences ===== | ||
+ | |||
+ | Python appartient a la PSF (Python Software Fondation) qui est une organisation à but non lucratif. La licence est permissive et permet de l' | ||
+ | |||
+ | ===== Évolution du langage ===== | ||
+ | |||
+ | Toute proposition concernant l' | ||
+ | |||
+ | ===== Bref historique ===== | ||
+ | |||
+ | Première version python 1.0 sortie en 1994. Version 2 en 2000. Grosse rupture de compatibilité entre la version 2 et la version 3. Langage stable et maintenu. | ||
+ | |||
+ | |||
+ | Librairie standard: ensemble des utilitaires packagés, distribués et maintenus avec Python. | ||
+ | |||
+ | ===== EDI et Interpréteurs ===== | ||
+ | |||
+ | IDLE (prononcer Aïdeul) est l'EDI proposé par la librairie standard mais il existe de nombreux EDI supportant python on pourra citer: PyCharm, | ||
+ | |||
+ | **ipython** est interpréteur proposant des couleurs, de l' | ||
+ | |||
+ | <code bash> | ||
+ | $ sudo apt-get install ipython | ||
+ | |||
+ | # ou sous les versions plus récentes de Debian/ | ||
+ | $ sudo apt-get install ipython3 | ||
+ | </ | ||
+ | |||
+ | Pour plus de détails concernant l' | ||
+ | |||
+ | ===== Jeux de caractères ===== | ||
+ | |||
+ | Par défaut l’interpréteur python2.7 attend des scripts utilisant le jeu de caractères | ||
+ | |||
+ | <code python> | ||
+ | # coding: utf8 | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | |||
+ | Généralement pour un fichier script l’entête comprend également le chemin de l’interpréteur à appeler: | ||
+ | |||
+ | <code python> | ||
+ | # | ||
+ | # coding: utf8 | ||
+ | </ | ||
+ | |||
+ | Cet entête permet d' | ||
+ | |||
+ | <code bash> | ||
+ | ./ | ||
+ | </ | ||
+ | ===== Variables ===== | ||
+ | |||
+ | Une variable référence un objet. Python gère deux espaces: | ||
+ | * l' | ||
+ | * l' | ||
+ | |||
+ | Lors d'une déclaration telle que: | ||
+ | <code python> | ||
+ | >>> | ||
+ | </ | ||
+ | |||
+ | 3 étapes: | ||
+ | * L' | ||
+ | * Création de la variable " | ||
+ | * La référence vers l' | ||
+ | |||
+ | **La valeur de toute variable est une référence à un objet**. Le typage est dynamique mais le langage est fortement typé. En python le type n'est pas lié à la variable qui référence l' | ||
+ | |||
+ | En python les noms des variables ne peuvent pas commencer par un chiffre. Le nom se compose des caractères alphanumériques sans caractères spéciaux. Les noms sont sensibles à la casse de caractère. | ||
+ | |||
+ | < | ||
+ | Prendre l' | ||
+ | </ | ||
+ | |||
+ | Par convention les variables sont en minuscules. Par convention également les variables " | ||
+ | |||
+ | Dans tous les cas il est fortement déconseillé d' | ||
===== Types de base ===== | ===== Types de base ===== | ||
- | En Python tout est objet, le type d'une variable est déterminé dynamiquement, | + | En Python tout est objet. Le type d'une variable est déterminé dynamiquement, |
+ | Le type est important puisqu' | ||
+ | |||
+ | ^ Type ^ Mutablilité | | ||
+ | | int, float | immuable | ||
+ | | complex, | ||
+ | | str | immuable | ||
+ | | list | mutable | ||
+ | | dict | mutable | ||
+ | | set | mutable | ||
+ | | frozenset | ||
+ | |||
+ | Un objet mutable peut être modifié en place. Un objet immuable ne peut être modifié, python doit réallouer un espace mémoire différent et mettre à jour la référence. | ||
<code python> | <code python> | ||
Ligne 30: | Ligne 134: | ||
Remarques: | Remarques: | ||
- | - La fonction **type()** retourne le type de la variable passée en paramètre. | + | - La fonction **type()** retourne le type de l' |
- Python ne distingue pas caractère et chaîne de caractères, | - Python ne distingue pas caractère et chaîne de caractères, | ||
+ | |||
+ | La fonction **isinstance()** est plus largement utilisée pour la mise en œuvre des mécanismes d' | ||
+ | |||
+ | De plus comme python est un langage à typage dynamique, isinstance() permet de s' | ||
+ | |||
+ | < | ||
+ | Depuis python 3.5 les **Type hints** ou annotations de types permettent d' | ||
+ | </ | ||
==== La liste ==== | ==== La liste ==== | ||
- | Une liste est un ensemble ordonné d' | + | Une liste est un ensemble |
<code python> | <code python> | ||
Ligne 51: | Ligne 163: | ||
[' | [' | ||
</ | </ | ||
+ | |||
+ | Notes plus détaillées à propos des [[dev: | ||
==== Le tuple ==== | ==== Le tuple ==== | ||
- | Le tuple est un ensemble ordonné et figé d' | + | Le tuple est un objet séquence très proche de la liste, sa principale différence est d' |
<code python> | <code python> | ||
Ligne 75: | Ligne 189: | ||
TypeError: ' | TypeError: ' | ||
</ | </ | ||
+ | |||
+ | < | ||
+ | Chaines, listes et tuples sont des **séquences**, | ||
+ | </ | ||
==== Slicing ==== | ==== Slicing ==== | ||
- | Le slicing permet de sélectionner un sous ensemble | + | Le slicing permet de sélectionner un sous ensemble |
- | - le premier élément | + | - l' |
- | - le dernier élément+1 | + | - l' |
- le pas | - le pas | ||
Ligne 100: | Ligne 218: | ||
>>> | >>> | ||
etxet iloj nu | etxet iloj nu | ||
- | |||
- | |||
</ | </ | ||
+ | |||
+ | Notes plus détaillées à propos des [[dev: | ||
==== Le dictionnaire ==== | ==== Le dictionnaire ==== | ||
- | Un dictionnaire est un ensemble dynamique non ordonné (on parle aussi de tableau associatif). On accède aux élément via la clé. Une clé peut être une chaîne de caractères ou un nombre. | + | Un dictionnaire est un ensemble dynamique non ordonné (on parle aussi de tableau associatif). On accède aux élément via la clé. |
<code python> | <code python> | ||
Ligne 114: | Ligne 232: | ||
Remarque: Pour copier un dictionnaire utiliser la méthode **copy()** | Remarque: Pour copier un dictionnaire utiliser la méthode **copy()** | ||
+ | |||
+ | Confère wiki [[dev: | ||
===== Définition d'un objet ===== | ===== Définition d'un objet ===== | ||
<code python> | <code python> | ||
- | class monType(object) | + | class monType(object): |
""" | """ | ||
- | __init__(self, | + | |
""" | """ | ||
+ | | ||
def methode_1(self, | def methode_1(self, | ||
+ | | ||
def methide_2(self, | def methide_2(self, | ||
</ | </ | ||
Ligne 150: | Ligne 272: | ||
</ | </ | ||
+ | ===== Paradigme objet ===== | ||
+ | |||
+ | En python tout est objet, quelques méthodes d' | ||
+ | * **dir()** pour lister objets et méthodes | ||
+ | * **help()** pour afficher l'aide intégrée au code | ||
+ | * **type()** pour connaître le type d'un objet | ||
+ | * **id()** retourne l' | ||
+ | * **eval()** pour évaluer une chaîne de caractères | ||
+ | |||
+ | <code python> | ||
+ | |||
+ | >>> | ||
+ | >>> | ||
+ | |||
+ | >>> | ||
+ | >>> | ||
+ | |||
+ | >>> | ||
+ | True | ||
+ | |||
+ | >>> | ||
+ | adresse c1: 7fc861d4b0b0 | ||
+ | |||
+ | >>> | ||
+ | adresse c2: 7fc861d4b0b0 | ||
+ | |||
+ | >>> | ||
+ | >>> | ||
+ | c1 += ' hello' | ||
+ | |||
+ | >>> | ||
+ | False | ||
+ | |||
+ | >>> | ||
+ | adresse c1: 7fc8535cf6b0 | ||
+ | </ | ||
===== Import et modules ===== | ===== Import et modules ===== | ||
Ligne 160: | Ligne 318: | ||
===== Tester si le script est directement appelé ==== | ===== Tester si le script est directement appelé ==== | ||
- | Il est possible de tester si le script est appelé directement ou via un import avec le code suivant: | + | Il est possible de tester si le script est appelé directement ou via un import avec le code ci-dessous: |
<code python> | <code python> | ||
- | if __name__ == __main__: | + | # Déclaration variables et directives importables |
+ | # par d' | ||
+ | |||
+ | if __name__ == "__main__": | ||
+ | # Le Bloc ci dessous n'est exécuté que | ||
+ | # lorsque le script est appelé directement | ||
+ | # mais pas lorsqu' | ||
</ | </ | ||
- | ===== | + | Ce branchement conditionnel est souvent utilisé pour des tests unitaires. |
+ | |||
+ | ===== | ||
Les objets python savent qui ils sont, c'est l' | Les objets python savent qui ils sont, c'est l' | ||
Ligne 176: | Ligne 341: | ||
</ | </ | ||
- | ===== Documentation | + | ===== La documentation |
- | Python intègre nativement la documentation au code (attribut __doc__ d'une instance). Lors de la définition d'une classe ou d'une méthode, ajouter un texte entre triple guillemets sous la définition pour qu' | + | Python intègre nativement la documentation au code (c'est la documentation en ligne contenue dans l'attribut __doc__ d'une instance). Lors de la définition d'une classe ou d'une méthode, ajouter un texte entre triple guillemets sous la définition pour qu' |
Remarque: La position du commentaire est importante. Seuls les commentaires entre triples guillemets sous la déclaration seront exportés. Attention a bien indenter le commentaire. | Remarque: La position du commentaire est importante. Seuls les commentaires entre triples guillemets sous la déclaration seront exportés. Attention a bien indenter le commentaire. | ||
+ | |||
+ | Pour obtenir de l' | ||
+ | <code python> | ||
+ | help(str) | ||
+ | </ | ||
+ | |||
+ | La commande **dir()** permet de lister les symboles existants au sein d'un module: | ||
+ | <code python> | ||
+ | >>> | ||
+ | >>> | ||
+ | ' | ||
+ | >>> | ||
+ | </ | ||
La commande pydoc se charge d' | La commande pydoc se charge d' | ||
Ligne 189: | Ligne 367: | ||
$ pydoc test.py | $ pydoc test.py | ||
</ | </ | ||
+ | |||
+ | ===== Débogage des scripts ===== | ||
+ | |||
+ | Python fournit un le module **pdb**. | ||
+ | |||
+ | <code python> | ||
+ | import pdb | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | si vous utilisez l’interpréteur ipython, ipdp | ||
+ | |||
+ | <code bash> | ||
+ | pip install ipdb | ||
+ | </ | ||
+ | |||
+ | ===== Tests et tests unitaires ===== | ||
+ | |||
+ | Pour les tests le mot clé **assert** permet de lever une exception **AssertionError** lorsque l' | ||
Ligne 195: | Ligne 393: | ||
* https:// | * https:// | ||
* http:// | * http:// | ||
+ | * http:// | ||