Licence CC BY-SA

Notions de Python avancées

Découvrez Python plus en profondeur

Dernière mise à jour :

Python est simple.

C'est probablement ce que l'on vous a dit de nombreuses fois, et ce que vous avez constaté en apprenant et pratiquant ce langage. Mais derrière cette simplicité apparante existent un certain nombre de concepts plus complexes qui forment la puissance de ce langage.

En Python, on s'intéresse plus au comportement des objets qu'à leur nature. Ainsi, l'interface des objets (c'est à dire l'ensemble de leurs attributs et méthodes) est quelque chose de très important, c'est entre autres ce qui les définit.

En effet, une grande partie des outils du langage sont génériques — tels les appels de fonctions ou les boucles for — c'est à dire qu'ils peuvent s'appliquer à des types différents. Python demande simplement à ces types de respecter une interface en implémentant un certain nombre de méthodes spéciales. Ces interfaces et méthodes seront décrites dans le cours.

Le pré-requis pour suivre ce tutoriel est de connaître Python, même à un niveau débutant, il est simplement nécessaire de savoir manipuler les types de base (nombres, chaînes de caractères, listes, dictionnaires). Connaître le mécanisme des exceptions est un plus.

Ce cours se divise en chapitres consacrés chacun à une spécificité du langage. Ces dernières ne devraient plus avoir de secret pour vous une fois la lecture terminée.

Je tiens aussi à préciser que ce cours s'adresse principalement aux utilisateurs de Python 3, et n'est pas valable pour les versions de Python inférieures.

Conteneurs

  1. Les conteneurs, c'est in
  2. C'est pas la taille qui compte
  3. Objets indexables
  4. Les slices
  5. TP : Une liste chaînée en Python

Itérables

  1. for for lointain
  2. Utilisation des iterables
  3. Utilisation avancée : le module itertools
  4. TP : Itérateur sur listes chaînées

Callables

  1. Fonctions, classes et lambdas
  2. Paramètres de fonctions
  3. Call-me maybe
  4. Utilisation des callables
  5. Modules operator et functools
  6. TP : itemgetter

Générateurs

  1. Dessine-moi un générateur
  2. Altérer un générateur avec send
  3. Déléguer à un autre générateur avec yield from
  4. Listes et générateurs en intension
  5. Liste ou générateur ?
  6. TP : Un petit creux ?

Décorateurs

  1. D&CO, une semaine pour tout changer
  2. Décorateurs paramétrés
  3. Envelopper une fonction
  4. TP : divers décorateurs

Accesseurs et descripteurs

  1. L'attribut de Dana
  2. Les descripteurs
  3. Les propriétés
  4. Les méthodes
  5. TP : propriétés et méthodes

Gestionnaires de contexte

  1. with or without you
  2. La fonction open
  3. Fonctionnement interne
  4. Simplifions-nous la vie avec la contextlib
  5. TP : changement de répertoire

Métaclasses

  1. Instance, classe et métaclasse
  2. Quel est donc ce type ?
  3. Le vrai constructeur
  4. Les métaclasses
  5. Utiliser une fonction comme métaclasse
  6. TP : Évaluation paresseuse


Ce cours touche maintenant à sa fin. Puisse-t-il vous avoir fait découvrir de nouveaux concepts de Python, ou l'envie de voir encore plus loin.

Ce cours ne couvre en effet qu'un nombre restreint de domaines, qui pourraient chacun être plus approfondis. Il y aurait encore tant à dire, sur les coroutines, sur les utilisations de l'interpréteur, sur les outils, les librairies, les frameworks. À elle seule, la librairie standard regorge encore de nombreuses choses, et je vous invite à voguer dans les pages de sa documentation.

Je tiens aussi à remercier les différents contributeurs ayant aidé à l'élaboration de ce projet :

  • Vayel, pour ses longues et intensives relectures ;
  • nohar, pour les précisions apportées tout le long de l'écriture du tutoriel ;
  • Bibibye, pour les nombreuses typographies corrigées ;
  • yoch, pour ses diverses corrections.

Notez enfin que ce cours est diffusé sous licence Creative Commons Attribution-ShareAlike 4.0 et que toute contribution est bienvenue. Les sources sont disponibles à l'adresse suivante : https://github.com/entwanne/cours_python_avance

6 commentaires

Bravo pour tout ce travail (même si je n'ai pas vraiment eu le temps de jeter un œil attentif à ce tuto). Mais je crois comprendre qu'il devrait entrer dans cette collection de tutos. Auquel cas, ne faudrait-il pas un petit bloc d'information dans l'intro avec un lien vers le tuto pour débutant. En effet, tout le monde n'accèdera pas à ce tuto via ZdS, certains le trouveront via google ou autre. Réciproquement, le tuto pour débutant devrait avoir un bloc (dans son intro et/ou sa conclusion) avec un lien vers ce tuto. Un truc du genre :

Ce tutoriel exige des notions avancées de programmation en langage Python. Si vous n'avez jamais pratiqué, Zeste de Savoir vous propose également un tutoriel d'introduction plus accessible. Pour cela, il vous suffit de cliquer ici : Apprendre à programmer avec Python 3.

+2 -0

Bonjour, Dans le paragraphe consacré aux descripteurs il y a ce code:

@property def celsius(self): return self.value @celsius.setter def celsius(self, value): # le nom de cette méthode a peu d'importance self.value = value

Je ne suis pas d'accord avec le commentaire. Le nom de la méthode est important. J'ai essayé de le remplacer par toto et le code ne marche plus. On n'a pas le code de la méthode celcius.setter, mais je suppose que cette méthode intègre la méthode setter à l'objet puis retourne l'objet qui se retrouve dans la variable de classe celsius grâce au décorateur.

pendant que j'y suis, dans le code de la classe my_property

class my_property: def init(self, fget, fset, fdel): self.fget = fget self.fset = fset self.fdel = fdel def get(self, instance, owner): return self.fget(instance) def set(self, instance, value): return self.fset(instance, value) def delete(self, instance): return self.fdel(instance)

les méthodes set et delete retournent quelque chose. Cela me paraît étrange.

+0 -0

Bonjour,

Je venais juste de croiser ton message sur OCR, la modification a été faite et poussée sur le dépôt Git. La demande de validation a aussi été effectuée, ça ne devrait pas prendre beaucoup de temps vu l'ampleur de la modification :)

Pour les méthodes __set__ et __delete__ et leur return, c'est simplement pour relayer le retour, même si celui-ci devrait toujours être None.

Merci.

Édité par entwanne

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte