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/02/16 14:50] – root | dev:python:start [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Python ===== | + | {{tag> |
| + | |||
| + | ====== Python: introduction | ||
| + | |||
| + | Quelques notes à propos des spécificités du langage Python basées sur mes écueils. | ||
| + | |||
| + | 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 ===== | ||
| + | |||
| + | 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> | ||
| + | >>> | ||
| + | ... | ||
| + | >>> | ||
| + | >>> | ||
| + | <type ' | ||
| + | >>> | ||
| + | ... | ||
| + | >>> | ||
| + | >>> | ||
| + | <type ' | ||
| + | >>> | ||
| + | ... | ||
| + | >>> | ||
| + | >>> | ||
| + | <type ' | ||
| + | >>> | ||
| + | >>> | ||
| + | <type ' | ||
| + | |||
| + | </ | ||
| + | |||
| + | Remarques: | ||
| + | - La fonction **type()** retourne le type de l' | ||
| + | - 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 ==== | ||
| + | |||
| + | Une liste est un ensemble **ordonné** d' | ||
| - | la liste est un objet, elle contient plusieurs objets/ | ||
| <code python> | <code python> | ||
| >>> | >>> | ||
| </ | </ | ||
| - | Les dictionnaires sont comme des listes mais les indices(on parle de clé) sont des chaines auxquelles on associe une valeur. | + | Le contenu d'une liste peut être modifié, on peut ajouter/ |
| <code python> | <code python> | ||
| - | >>> | + | >>> |
| + | >>> | ||
| + | 2.1 | ||
| + | >>> | ||
| + | >>> | ||
| + | ['tata', 2, 'z', 2.5] | ||
| </ | </ | ||
| - | Tester si le script | + | Notes plus détaillées à propos des [[dev: |
| + | |||
| + | ==== Le tuple ==== | ||
| + | |||
| + | Le tuple est un objet séquence très proche de la liste, sa principale différence est d' | ||
| <code python> | <code python> | ||
| - | if __name__ | + | # 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): | ||
| + | File "< | ||
| + | TypeError: ' | ||
| </ | </ | ||
| - | Les objets python savent qui ils sont, c' | + | < |
| - | La documentation est intégrée au code (__doc__) | + | Chaines, listes et tuples |
| + | </ | ||
| + | ==== 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 | ||
| </ | </ | ||
| - | Pour utiliser une fonction présente dans un fichier, utiliser la directive import avec le nom de fichier sans le suffixe | + | Notes plus détaillées à propos des [[dev: |
| - | Dans un module, les variables globales sont accessibles. Ils est possible | + | ==== Le dictionnaire ==== |
| + | |||
| + | Un dictionnaire | ||
| + | |||
| + | <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 ===== | ||
| <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, | ||
| </ | </ | ||
| Remarques: | Remarques: | ||
| - | | + | |
| - | | + | |
| - | Instanciation d' | + | ===== Instanciation d' |
| <code python> | <code python> | ||
| 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 60: | Ligne 271: | ||
| >>> | >>> | ||
| </ | </ | ||
| + | |||
| + | ===== 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 ===== | ||
| + | |||
| + | Pour utiliser une fonction présente dans un fichier, utiliser la directive import avec le nom de fichier sans le suffixe .py | ||
| + | |||
| + | Remarque: dans un module, les variables globales sont accessibles. Ils est possible de modifier la valeur de la variable du module, cela peut être problématique: | ||
| + | |||
| + | |||
| + | ===== 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 ci-dessous: | ||
| + | <code python> | ||
| + | # Déclaration variables et directives importables | ||
| + | # par d' | ||
| + | |||
| + | if __name__ == " | ||
| + | # 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. | ||
| + | |||
| + | ===== L' introspection ===== | ||
| + | |||
| + | Les objets python savent qui ils sont, c'est l' | ||
| + | |||
| + | <code python> | ||
| + | >>> | ||
| + | [' | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== 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:// | ||
| + | |||
| + | |||