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/06/23 12:29] – modification externe 127.0.0.1 | 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:// | ||
+ | |||
+ | |||