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 [2013/10/13 17:18] – 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 ===== | ||
| - | Python | + | En Python |
| + | 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 ==== | ||
| - | La liste est un objet, elle peut contenir des objets de différents types. | + | Une liste est un ensemble **ordonné** d'objets |
| <code python> | <code python> | ||
| >>> | >>> | ||
| Ligne 50: | Ligne 163: | ||
| [' | [' | ||
| </ | </ | ||
| + | |||
| + | Notes plus détaillées à propos des [[dev: | ||
| ==== Le tuple ==== | ==== Le tuple ==== | ||
| - | Le tuple est une liste figée, on ne peut pas ajouter/ | + | Le tuple est un objet séquence très proche de la liste, |
| <code python> | <code python> | ||
| + | # La syntaxe de déclaration d'un tuple utilise les parenthèse: | ||
| >>> | >>> | ||
| - | >>> | + | |
| + | # La syntaxe abrégée de déclaration d'un tuple | ||
| + | >>> | ||
| + | >>> | ||
| + | (1, ' | ||
| + | |||
| + | # Si le tuple a un seul élément, bien terminer la déclaration par la virgule lors de l' | ||
| + | >>> | ||
| + | >>> | ||
| + | (' | ||
| + | |||
| + | >>> | ||
| Traceback (most recent call last): | Traceback (most recent call last): | ||
| File "< | File "< | ||
| TypeError: ' | TypeError: ' | ||
| + | </ | ||
| + | < | ||
| + | Chaines, listes et tuples sont des **séquences**, | ||
| + | </ | ||
| + | |||
| + | ==== Slicing ==== | ||
| + | |||
| + | Le slicing permet de sélectionner un sous ensemble dans une séquence (liste, tuple, string, etc) en spécifiant: | ||
| + | - l' | ||
| + | - l' | ||
| + | - le pas | ||
| + | |||
| + | Remarque 1: Si les arguments ne sont pas spécifiés, | ||
| + | |||
| + | Remarque 2: si le pas est négatif on parcourt la variable en sens inverse, pratique pour inverser une chaîne. | ||
| + | |||
| + | <code python> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | joli | ||
| + | |||
| + | >>> | ||
| + | >>> | ||
| + | un joli | ||
| + | |||
| + | >>> | ||
| + | >>> | ||
| + | etxet iloj nu | ||
| </ | </ | ||
| + | |||
| + | Notes plus détaillées à propos des [[dev: | ||
| ==== Le dictionnaire ==== | ==== Le dictionnaire ==== | ||
| - | Les dictionnaires sont équivalents aux listes mais les indices(on parle de clé) sont des chaines auxquelles on associe une valeur. | + | Un dictionnaire est un ensemble dynamique non ordonné |
| <code python> | <code python> | ||
| - | >>> | + | # déclaration d'un dictionnaire |
| + | >>> | ||
| </ | </ | ||
| + | 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 94: | Ligne 259: | ||
| mon_objet = maClasse(valeur1, | mon_objet = maClasse(valeur1, | ||
| </ | </ | ||
| - | Pour instancier un objet de la classe maClasse, j' | + | Pour instancier un objet de la classe maClasse, j' |
| Exemple | Exemple | ||
| - | Se placer dans le dossier ~/ | + | Se placer dans le dossier ~/ |
| <code python> | <code python> | ||
| >>> | >>> | ||
| Ligne 107: | 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 117: | 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 133: | Ligne 341: | ||
| </ | </ | ||
| - | ===== Documentation | + | ===== La documentation |
| + | |||
| + | Python intègre nativement la documentation au code (c'est la documentation en ligne contenue dans l' | ||
| + | |||
| + | 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' | ||
| + | |||
| + | Remarque: Pour les scripts python3 utiliser pydoc3 | ||
| + | |||
| + | <code bash> | ||
| + | $ 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' | ||
| + | |||
| + | |||
| + | ===== Références ===== | ||
| + | |||
| + | * https:// | ||
| + | * http:// | ||
| + | * http:// | ||
| - | Python intègre nativement la documentation au code attribut (__doc__). 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' | ||