Il est également apprécié par certains pédagogues qui y trouvent un langage où la syntaxe, clairement séparée des mécanismes de bas niveau, permet une initiation aisée aux concepts de base de la programmation[4]. Selon l'Index TIOBE, notamment en raison de son efficacité pour l'apprentissage automatique, sa popularité va croissante ; et en 2022 n'a toujours pas montré de signe de ralentissement[5].
Utilisation
Python est un langage de programmation qui peut s'utiliser dans de nombreux contextes et s'adapter à tout type d'utilisation grâce à des bibliothèques spécialisées.
Il est cependant particulièrement utilisé comme langage de script pour automatiser des tâches simples mais fastidieuses, comme un script qui récupérerait la météo sur Internet ou qui s'intégrerait dans un logiciel de conception assistée par ordinateur afin d'automatiser certains enchaînements d'actions répétitives (voir la section Adoption). On l'utilise également comme langage de développement de prototype lorsqu'on a besoin d'une application fonctionnelle avant de l'optimiser avec un langage de plus bas niveau. Il est particulièrement répandu dans le monde scientifique, et possède de nombreuses bibliothèques optimisées destinées au calcul numérique.
Durant l'année suivante, le langage commence à être adopté par l'équipe du projet Amoeba, Guido poursuivant son développement principalement pendant son temps libre. En , la première version publique, numérotée 0.9.0[12], est postée sur le forum Usenet alt.sources. La dernière version sortie au CWI est Python 1.2.
Au CNRI
En 1995, Van Rossum continue son travail sur Python au CNRI(en) à Reston, aux États-Unis, où il sort plusieurs versions du logiciel.
À partir d', l'équipe Python travaille au CNRI sur Grail[13] un navigateur web utilisant Tk. Il est l'équivalent pour Python du navigateur HotJava, permettant d'exécuter des applets dans un environnement sécurisé. La première version publique, disponible en novembre, est la 0.2[14]. Il entraîne le développement de modules pour la bibliothèque standard comme rexec[15], htmllib[16] ou urllib[17]. La version 0.6 sera la dernière de Grail ; elle est publiée en [18].
En 1999, le projet Computer Programming for Everybody[19] (CP4E) est lancé conjointement entre le CNRI et la DARPA. Il s'agit d'utiliser Python comme un langage d'enseignement de la programmation. Cette initiative conduira à la création de l'environnement de développementIDLE. Cependant, du fait du manque de financement du projet par la DARPA, et du départ de nombreux développeurs Python du CNRI (dont Guido van Rossum), le projet s'éteint en 2000[20]. Python 1.6 est la dernière version sortie au CNRI.
À BeOpen
En 2000, l'équipe principale de développement de Python déménage à BeOpen.com pour former l'équipe PythonLabs de BeOpen. Python 2.0 est la seule version sortie à BeOpen.com. Après cette version, Guido Van Rossum et les autres développeurs de PythonLabs rejoignent Digital Creations (à présent connue sous le nom de Zope Corporation)[21].
Andrew M. Kuchling publie en [22] un texte nommé Python Warts[23], qui synthétise les griefs les plus fréquents exprimés à l'encontre du langage. Ce document aura une influence certaine sur les développements futurs du langage[24].
Afin de réparer certains défauts du langage (par exemple l'orienté objet avec deux types de classes), et pour nettoyer la bibliothèque standard de ses éléments obsolètes et redondants, Python a choisi de casser la compatibilité ascendante dans la nouvelle version majeure, Python 3.0, publié en . Cette version est rapidement suivie par une version 3.1 qui corrige les erreurs de jeunesse de la version 3.0.
Selon l'Index TIOBE, « Python, qui est devenu un élément incontournable de la science des données, du DevOps et du développement web, est aussi désormais le langage le plus populaire dans le classement de TIOBE. Classé troisième langage le plus populaire de l'index au début de l'année 2021, Python s'est hissé à la première place en octobre 2022 »[5].
Caractéristiques
Syntaxe
Python a été conçu pour être un langage lisible. Il vise à être visuellement épuré. Par exemple, il possède moins de constructions syntaxiques que de nombreux langages structurés tels que C, Perl, ou Pascal. Les commentaires sont indiqués par le caractère croisillon (#).
Les blocs sont identifiés par l'indentation, au lieu d'accolades comme en C ou C++ ; ou de begin ... end comme en Pascal ou Ruby. Une augmentation de l'indentation marque le début d'un bloc, et une réduction de l'indentation marque la fin du bloc courant. Par convention (actuellement PEP8[25]), l'indentation est habituellement de quatre espaces en Python[26].
Remarque : L'indentation pourrait être modifiée ou supprimée dans la version en C sans modifier son comportement. De même, la fonction Python peut être écrite avec une expression conditionnelle[27]. Cependant, une indentation correcte permet de détecter plus aisément des erreurs en cas d'imbrication de plusieurs blocs et facilite donc l'élimination de ces erreurs. C'est pourquoi il est préférable d'indenter convenablement les programmes en C. La version courte s'écrirait ainsi :
Les mots-clés réservés du langage Python sont fournis dans la liste keyword.kwlist du module keyword[28].
Les mots-clés de Python 2.7.5 sont les suivants : and, as, assert, break, class, continue, def, del, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while, with, yield.
À partir de Python 3.0, print et exec ne sont plus des mots-clés du langage, mais des fonctions du module builtins[29]. Sont ajoutés aux mots-clés : True, False, None et nonlocal. Les trois premiers étaient déjà présents dans les versions précédentes, mais ils ne sont plus modifiables (auparavant, l'affectation True = 1 était possible)[30]. nonlocal a été introduit par le PEP 3104[31], et permet, dans une fonction définie à l'intérieur d'une autre fonction, de modifier une variable d'un niveau supérieur de portée. Avant cela, seules les variables locales à la fonction, et globales (niveau module) étaient modifiables. Toutefois, il était possible, et ça l'est toujours sans le mot-clé nonlocal, de modifier un objet affecté à une variable d'un niveau de portée supérieur, par exemple une liste avec la méthode append - c'est évidemment impossible pour un objet immuable.
À partir de Python 3.10, il y a 3 mots-clés contextuels (« soft keywords » en anglais) : match, case, _ identique à l’instruction switch-case.
matchvaleur:casecondition_1:expression_1casecondition_2:expression_2case_:# `case _´ est accédé si toutes les autres conditions sont fausses.expression_par_défault
Types de base
Les types de base en Python sont relativement complets et puissants. Il y a, entre autres :
Les objets numériques
int est le type des entiers relatifs. Avant la version 3.0, ce type était dénommé long, et le type int correspondait à un entier de 32 ou 64 bits. Néanmoins, une conversion automatique en type long évitait tout débordement. Maintenant, ce type correspond aux entiers relatifs avec une précision illimitée sans restriction de taille.
long est le type des entiers relatifs, illimités de plus de 32 bits en Python 2, remplacé par le type int en Python 3
float est le type flottant équivalent au type doubledu C, soit tout nombre entre −1,7 × 10308 et 1,7 × 10308 sur les plateformes conforme à l'IEEE 754.
complex est le type des approximations des nombres complexes (c'est-à-dire deux float).
Les objets « itérables »
Les objets tuple (n-uplet) sont des listes immuables d'objets hétérogènes.
Les objets list sont des tableaux dynamiques (ils étendent automatiquement leur taille lorsque nécessaire) et acceptent des types de données hétérogènes.
Les objets set sont des ensembles non ordonnés d'objets.
Les objets frozenset forment une variante immuable des set.
Les objets dict sont des tableaux associatifs (ou dictionnaires) permettant d'associer un objet (une clef) à un autre.
Les objets str sont des chaînes de caractères. À partir de la version 3.0, les caractères sont en Unicode sur 16 ou 32 bits ; les chaines d'octets sont des objets bytes[32]. Dans les versions précédentes, ces objets étaient respectivement de type unicode et str. Les objets str et bytes sont immuables.
Les objets bytearray sont des chaînes d'octets modifiables. La version d'Unicode employée par Python peut être déterminée à l'aide de la variable unidata_version du module unicodedata.
Les objets file correspondent à un fichier obtenu grâce à la méthode open()
Il existe aussi d'autres types d'objets itérables, notamment range obtenu via la méthode range(), et les types liés aux méthodes de dictionnaires .keys(), .values() et .items(). La plupart d'entre eux sont immuables.
Les autres objets, n'étant ni numériques ni itérables
None est simplement le type d'un « vide ». Il sert à dénoter qu'une variable est vide.
type est le type du type des objets, obtenu grâce à la méthode type().
object est le type basique dont tous les autres types « héritent »
slice est une partie de type ou un objet extensible
NotImplementedType est, comme son nom l'indique, une absence d'implémentation du type auquel on essaie d'accéder.
bool est un booléen, soit le type de True et False renvoyés par exemple lors de comparaisons hors de l'utilisation de méthodes is_x().
exception est le type d'un message d'erreur lancé lorsque le code lève une exception.
function est le type d'une fonction, utilisé lors de l'appel des mots-clef def et lambda.
module est le type d'un module, utilisé lors de l'appel des mots-clef import et from.
Les objets itérables sont parcourus à l'aide d'une boucle for de la manière suivante :
forelementinobjet_iterable:traiter(element)
Pour une chaîne de caractères, l'itération procède caractère par caractère.
Il est possible de dériver les classes des types de base pour créer ses propres types.
On peut également fabriquer ses propres types d'objets itérables sans hériter des itérables de base en utilisant le protocole d'itération du langage.
Programmation fonctionnelle
Python permet de programmer dans un style fonctionnel. Il dispose également des compréhensions de listes, et plus généralement les compréhensions peuvent produire des générateurs, des dictionnaires ou des ensembles[33]. Par exemple, pour construire la liste des carrés des entiers naturels plus petits que 10, on peut utiliser l'expression :
liste=[entierforentierinrange(10)ifentier%2==0]# liste = [0, 2, 4, 6, 8]
Une table de passage des lettres de l'alphabet vers leur code ASCII :
{chr(n):nforninrange(65,91)}
L'ensemble des lettres d'un mot (produit l'ensemble {'r', 'c', 'd', 'b', 'a'}) :
s="abracadabra"{cforcins}
Une compréhension peut comprendre plusieurs boucles et filtres, et il existe une correspondance avec le code réalisant le même calcul à l'aide d'instructions for et if :
Cependant, une différence notable dans la version sans compréhension est que les variables i et j existent, avec la valeur qu'elles avaient lors de leur dernier tour de boucle. Ce n'est pas le cas pour des constructions par compréhension.
Les fonctions lambda peuvent être définies en ligne et utilisées comme arguments dans des expressions fonctionnelles :
filter(lambdax:x<5,une_liste)
retournera une liste constituée des éléments de une_liste inférieurs à 5. Le même résultat peut être obtenu avec
[xforxinune_listeifx<5]
Les lambdas de Python n'admettent que des expressions et ne peuvent être utilisées comme fonctions anonymes généralisées ; mais en Python, toutes les fonctions sont des objets, elles peuvent donc être passées en arguments à d'autres fonctions, et appelées lorsque c'est nécessaire. En effet, une fonction définie avec def peut être créée à l'intérieur d'une autre fonction et on obtient ainsi une définition de fonction dans une variable locale, par exemple :
On peut ainsi créer plusieurs accumulateurs, faisant chacun référence à son propre total. Il est possible d'accéder à l'environnement d'une fonction locale à l'aide de l'attribut __closure__.
Programmation objet
Tous les types de base, les fonctions, les instances de classes (les objets « classiques » des langages C++ et Java) et les classes elles-mêmes (qui sont des instances de méta-classes) sont des objets.
Une classe se définit avec le mot-clé class. Les classes Python supportent l'héritage multiple ; il n'y a pas de surcharge statique comme en C++, ou de restrictions sur l'héritage comme c'est le cas en Java (une classe implémente plusieurs interfaces et hérite d'une seule classe) mais le mécanisme des arguments optionnels et par mot-clé est plus général et plus flexible. En Python, l'attribut d'un objet peut référencer une variable d'instance ou de classe (le plus souvent une méthode). Il est possible de lire ou de modifier un attribut dynamiquement avec les fonctions :
Python fournit un mécanisme élégant et orienté objet pour définir un ensemble prédéfini d'opérateurs : tout objet Python peut se voir doté de méthodes dites spéciales.
Ces méthodes, commençant et finissant par deux tirets de soulignement (underscores), sont appelées lors de l'utilisation d'un opérateur sur l'objet : + (méthode __add__), += (méthode __iadd__), [] (méthode __getitem__), () (méthode __call__), etc. Des méthodes comme __repr__ et __str__ permettent de définir la représentation d'un objet dans l'interpréteur interactif et son rendu avec la fonction print.
Les possibilités sont nombreuses et sont décrites dans la documentation du langage[34].
Par exemple on peut définir l'addition de deux vecteurs à deux dimensions avec la classe suivante :
classVector2D:def__init__(self,x,y):# On utilise un tuple pour stocker les coordonnéesself.coords=(x,y)def__add__(self,other):# L'instruction a+b sera résolue comme a.__add__(b)# On construit un objet Vector2D à partir des coordonnées propres à l'objet, et à l'autre opérandereturnVector2D(self.coords[0]+other.coords[0],self.coords[1]+other.coords[1])def__repr__(self):# L'affichage de l'objet dans l'interpréteurreturn"Vector2D(%s, %s)"%self.coordsa=Vector2D(1,2)b=Vector2D(3,4)print(a+b)# Vector2D(4, 6)
Générateurs
Le mot-clef yield utilisé dans une fonction permet de faire de cette fonction un générateur. L'appel de cette fonction renvoie un objet de type generator, qui peut être utilisé dans une boucle for, par exemple.
À chaque appel, le générateur effectue son traitement jusqu'à rencontrer le mot-clé yield, renvoie la valeur de l'expression yield, et à l'appel suivant, reprend son déroulement juste après le yield. Par exemple pour calculer la suite de Fibonacci, on peut écrire :
defgen_fibonacci():"""Générateur de la suite de Fibonacci"""a,b=0,1whileTrue:yielda# Renvoie la valeur de "a", résultat de l'itération en coursa,b=b,a+bfi=gen_fibonacci()foriinrange(20):print(next(fi))
Le module itertools permet de manipuler les générateurs. Par exemple, pour extraire les 10 premiers éléments du générateur précédent :
Depuis Python 3.3, il est possible de produire un générateur à partir d'une fonction récursive, grâce à la syntaxe yield from, apparue dans le PEP 380[35] et qui « délègue » le calcul à un sous-générateur. L'exemple suivant calcule les permutations des dames correspondant aux solutions du problème des huit dames étendu à un échiquier de taille n × n.
defqueens(n):a=list(range(n))up=[True]*(2*n-1)down=[True]*(2*n-1)defsub(i):forkinrange(i,n):j=a[k]p=i+jq=i-j+n-1ifup[p]anddown[q]:ifi==n-1:yieldtuple(a)else:up[p]=down[q]=Falsea[i],a[k]=a[k],a[i]yield fromsub(i+1)up[p]=down[q]=Truea[i],a[k]=a[k],a[i]yield fromsub(0)sum(1forainqueens(8))# Nombre de solutions, renvoie 92
Un générateur peut sembler identique à une fonction qui retourne une liste, mais contrairement à une liste qui contient tous ses éléments, un générateur calcule ses éléments un par un. Ainsi, le test 36 in [n * n for n in range(10)] va s'effectuer sur la liste calculée en entier, alors que dans 36 in (n * n for n in range(10)), qui utilise un générateur, le calcul des carrés s'arrête dès que 36 est trouvé. On peut s'en convaincre en remplaçant n * n par un appel de fonction réalisant un effet de bord, par exemple un affichage à l'écran.
Réflexivité
Grâce à un usage intensif des dictionnaires (conteneur associatif développé avec des tables de hachage), Python permet d'explorer les divers objets du langage (introspection) et dans certains cas de les modifier (intercession).
Typage
Le typage n'est pas vérifié à la compilation. Python utilise le duck typing : lors de l'exécution, si une méthode invoquée sur un objet a la même signature qu'une méthode déclarée sur cet objet, alors c'est cette dernière méthode qui est exécutée. De ce fait, invoquer une méthode qui n'existe pas sur un objet va échouer, signifiant que l'objet en question n'est pas du bon type. Malgré l'absence de typage statique, Python est fortement typé, interdisant des opérations ayant peu de sens (par exemple, additionner un nombre à une chaîne de caractères) au lieu de tenter silencieusement de la convertir en une forme qui a du sens. Python propose des fonctions permettant de transformer les variables dans un autre type :
points=3.2# points est du type floatprint("Tu as "+points+" points !")# Génère une erreur de typagepoints=int(points)# points est maintenant du type int (entier), sa valeur est arrondie à l'unité inférieure (ici 3)print("Tu as "+points+" points !")# Génère une erreur de typagepoints=str(points)# points est maintenant du type str (chaîne de caractères)print("Tu as "+points+" points !")# Plus d'erreur de typage, affiche 'Tu as 3 points !'
Depuis la version 3.0, Python propose l'annotation des variables dans les fonctions (introduit dans la PEP 3107[37]). Ce qui permet de rendre le code plus lisible sans pour autant faire office de solution de typage statique puisque rien n'oblige à suivre ces annotations[38].
defhello(name:str)->str:return"Hello {} !".format(name)hello("Alice")# Appel suggéré par les annotationshello(True)# Appel non conforme mais tout à fait fonctionnel
En complément, depuis la version 3.5, Python propose le module typing[39] (introduit dans la PEP 484[40]).
Il est possible d'effectuer une analyse statique des modules Python avec des outils comme Pylint [41], mypy [42], ou PyChecker. Sans nécessiter une exécution, ces outils repèrent des fautes ou des constructions déconseillées. Par exemple, une classe qui hérite d'une classe abstraite et qui ne redéfinit pas les méthodes abstraites, ou bien des variables utilisées avant d'être déclarées, ou encore des attributs d'instance déclarés en dehors de la méthode __init__.
Il est aussi possible de générer un code intermédiaire (bytecode) Python.
Des outils comme PyInstaller[43] ou d'autres plus spécifiques comme cx_Freeze sous Unix, Windows et macOS, py2app[44] sous macOS et py2exe sous Windows permettent de « compiler » un programme Python sous forme d'un exécutable comprenant le programme et un interpréteur Python.
Le programme ne tourne pas plus rapidement (il n'est pas compilé sous forme de code machine) mais cela simplifie largement sa distribution, notamment sur des machines où l'interpréteur Python n'est pas installé.
Modèle objet
En Python, tout est objet, dans le sens qu'une variable peut contenir une référence vers tous les éléments manipulés par le langage : nombres, méthodes, modules, etc.[45]. Néanmoins, avant la version 2.2, les classes et les instances de classes étaient un type d'objet particulier, ce qui signifiait qu'il était par exemple impossible de dériver sa propre sous-classe de l'objet list.
Méthodes
Le modèle objet de Python est inspiré de celui de Modula-3[46]. Parmi ces emprunts se trouve l'obligation de déclarer l'instance de l'objet courant, conventionnellement nommée self, comme premier argument des méthodes, et à chaque fois que l'on souhaite accéder à une donnée de cette instance dans le corps de cette méthode. Cette pratique n'est pas naturelle pour des programmeurs venant par exemple de C++ ou Java, la profusion des self étant souvent critiquée comme étant une pollution visuelle qui gêne la lecture du code. Les promoteurs du self explicite estiment au contraire qu'il évite le recours à des conventions de nommage pour les données membres et qu'il simplifie des tâches comme l'appel à une méthode de la superclasse ou la résolution d'homonymie entre données membres[47].
Python reconnaît trois types de méthodes :
les méthodes d'instance, qui sont celles définies par défaut. Elles reçoivent comme premier argument une instance de la classe où elles ont été définies.
les méthodes de classe, qui reçoivent comme premier argument la classe où elles ont été définies. Elles peuvent être appelées depuis une instance ou directement depuis la classe. Elles permettent de définir des constructeurs alternatifs comme la méthode fromkeys() de l'objet dict. Elles sont déclarées avec le décorateur @classmethod.
les méthodes statiques, qui ne reçoivent pas de premier argument implicite. Elles sont déclarées avec le décorateur @staticmethod.
Visibilité
Le langage a un support très limité de l'encapsulation. Il n'y a pas, comme en Java par exemple, de contrôle de l'accessibilité par des mots clefs comme protected ou private.
La philosophie de Python est de différencier conceptuellement l'encapsulation du masquage d'information. Le masquage d'information vise à prévenir les utilisations frauduleuses, c'est une préoccupation de sécurité informatique. Le module bastion de la bibliothèque standard, qui n'est plus maintenu dans les dernières versions du langage, permettait ainsi de contrôler l'accès aux attributs d'un objet dans le cadre d'un environnement d'exécution restreint.
L'encapsulation est une problématique de développement logiciel. Le slogan des développeurs Python est we're all consenting adults here[48] (nous sommes entre adultes consentants). Ils estiment en effet qu'il suffit d'indiquer, par des conventions d'écriture, les parties publiques des interfaces et que c'est aux utilisateurs des objets de se conformer à ces conventions ou de prendre leurs responsabilités. L'usage est de préfixer par un underscore les membres privés. Le langage permet par ailleurs d'utiliser un double underscore pour éviter les collisions de noms, en préfixant automatiquement le nom de la donnée par celui de la classe où elle est définie.
L'utilisation de la fonction property() permet de définir des propriétés qui ont pour but d'intercepter, à l'aide de méthodes, les accès à une donnée membre. Cela rend inutile la définition systématique d'accesseurs et le masquage des données comme il est courant de le faire en C++ par exemple.
Python possède une grande bibliothèque standard, fournissant des outils convenant à de nombreuses tâches diverses. Le nombre de modules de la bibliothèque standard peut être augmenté avec des modules spécifiques écrits en C ou en Python.
La bibliothèque standard est particulièrement bien conçue pour écrire des applications utilisant Internet, avec un grand nombre de formats et de protocoles standards gérés (tels que MIME et HTTP). Des modules pour créer des interfaces graphiques et manipuler des expressions rationnelles sont également fournis. Python inclut également un framework de tests unitaires (unittest, anciennement PyUnit avant version 2.1) pour créer des suites de tests exhaustives.
Conventions de style
Bien que chaque programmeur puisse adopter ses propres conventions pour l'écriture de code Python, Guido van Rossum a mis un guide à disposition, référencé comme « PEP 8 »[26]. Publié en 2001, il est toujours maintenu pour l'adapter aux évolutions du langage. Google propose également un guide[51].
Interfaces graphiques
Python possède plusieurs modules disponibles pour la création de logiciels avec une interface graphique. Le plus répandu est Tkinter. Ce module convient à beaucoup d'applications et peut être considéré comme suffisant dans la plupart des cas. Néanmoins, d'autres modules ont été créés pour pouvoir lier Python à d'autres bibliothèques logicielles (« toolkit »), pour davantage de fonctionnalités, pour une meilleure intégration avec le système d'exploitation utilisé, ou simplement pour pouvoir utiliser Python avec sa bibliothèque préférée. En effet, certains programmeurs trouvent l'utilisation de Tkinter plus pénible que d'autres bibliothèques. Ces autres modules ne font pas partie de la bibliothèque standard et doivent donc être obtenus séparément.
Les principaux modules donnant accès aux bibliothèques d'interface graphique sont Tkinter et Pmw (Python megawidgets)[52] pour Tk, wxPython pour wxWidgets, PyGTK pour GTK, PyQt et PySide pour Qt, et enfin FxPy pour le FOX Toolkit. Il existe aussi une adaptation de la bibliothèque SDL : Pygame, un binding de la SFML : PySFML, ainsi qu'une bibliothèque écrite spécialement pour Python : Pyglet(en).
Il est aussi possible de créer des applications Silverlight en Python sur la plateforme IronPython.
La communauté Python
Guido van Rossum est le principal auteur de Python, un langage de programmation largement utilisé dans divers domaines, allant du développement web à l'intelligence artificielle. Son rôle central dans l'évolution de Python lui a valu le titre humoristique de « Dictateur bienveillant à vie » (Benevolent Dictator for Life, BDFL). Cependant, en , Guido van Rossum a annoncé sa retraite de ce rôle, se déclarant en « vacances permanentes » de ses responsabilités de BDFL[53]. Par la suite, en , il a également retiré sa candidature au conseil directeur du langage Python[54].
Après le retrait de van Rossum, la gouvernance de Python est passée à un modèle plus démocratique, sous la direction d'un Conseil directeur composé de cinq membres élus. Ces membres sont principalement issus de la communauté des core developers, une équipe de développeurs ayant un accès en écriture au dépôt de CPython, l'implémentation de référence du langage Python. Cette équipe se coordonne principalement via la liste de diffusion python-dev, où sont discutées et décidées les évolutions du langage et de sa bibliothèque standard.
Les contributions de la communauté sont encouragées, et les développeurs tiers peuvent soumettre des améliorations via la plateforme de gestion de bugs et de suivi de tâches Roundup, qui a remplacé l'ancien système basé sur SourceForge. La transition vers GitHub en 2017 a également facilité la collaboration ouverte et la contribution au code source de Python.
Les utilisateurs et développeurs de bibliothèques tierces peuvent échanger via diverses autres ressources en ligne, notamment le forum Usenet anglophone comp.lang.python, ainsi que des forums, mailing lists, et réseaux sociaux plus modernes comme Reddit ou Discord.
Les références aux Monty Python, une troupe comique britannique, sont un élément récurrent dans la culture Python. Les tutoriels du langage utilisent souvent les termes spam et eggs comme variable métasyntaxique, en référence au célèbre sketch Spam des Monty Python, où le SPAM (un jambon en conserve) est omniprésent dans le menu. Ce sketch a d'ailleurs donné son nom au phénomène du courriel non sollicité, illustrant l'humour décalé et omniprésent dans la communauté Python.
Python est utilisé comme langage de programmation dans l'enseignement secondaire et supérieur, notamment en France[58]. Depuis 2013, il y est enseigné à tous les étudiants de classes préparatoires scientifiques dans le cadre du tronc commun (informatique commune). Auparavant, l'enseignement d'informatique était limité à une option en MP, l'enseignement se faisant en langage Caml ou Pascal. Cette option existe toujours, mais Pascal a été abandonné à partir de la session 2015 des concours et Caml a, lui, été enlevé au profit de OCaml dans cet enseignement. Les premières épreuves de concours portant sur le langage Python sont également celles de la session 2015[59],[60].
Implémentations du langage
Outre la version de référence, nommée CPython (car écrite en langage C), il existe d'autres systèmes mettant en œuvre le langage Python[61] :
PySpark est une interface de programmation permettant d'utiliser Spark à partir du langage Python pour faire des calculs distribués.
Ces autres versions ne bénéficient pas forcément de la totalité de la bibliothèque de fonctions écrites en C pour la version de référence, ni des dernières évolutions du langage.
Différentes distributions sont disponibles, qui incluent parfois beaucoup de paquets dédiés à un domaine donné[66] :
ActivePython[67] : disponible en version gratuite (ne pouvant être « utilisée en production ») ou commerciale.
Python(x,y)[68] : distribution Python à l'usage des scientifiques basée sur Qt et Eclipse. Obsolète, remplacé par WinPython
Enthought Canopy[69] : distribution à usage scientifique, disponible en version gratuite (Canopy Express) ou commerciale.
Anaconda[70] : distribution à usage scientifique, disponible en version gratuite ou commerciale.
Intel Distribution for Python[71] : distribution basée sur Anaconda, intégrant notamment la bibliothèque MKL(en) d'Intel afin d'accélérer les calculs numériques de bibliothèques telles que NumPy et SciPy, intégrées à la distribution. Elle est disponible gratuitement seule, ou bien intégrée à Intel Parallel Studio, qui nécessite une licence payante.
Pyzo[72] : « Python to the people », destinée à être facile d'utilisation.
WinPython[73]: distribution à usage scientifique avec Spyder, QT, etc.
Ce ne sont pas des implémentations différentes du langage Python : elles sont basées sur CPython, mais sont livrées avec un certain nombre de bibliothèques préinstallées.
Ajout des décorateurs de fonction/méthode (@decorateur)
Conversion automatique d'un entier court en entier long si le résultat d'une opération est trop grand
Expressions de générateur renvoyant les résultats l'un après l'autre et non pas sous forme d'une liste, exemple : sum( x for x in xrange(10000) )
Ajout des fonctions reversed() et sorted()
La fonction de tri sort() accepte les mots clés cmp, key et reverse
Création du module decimal et du routeur
2.5
Ajout de l'instruction with
Ajout des méthodes send(), throw() et close() aux générateurs
Expression conditionnelle (a if test else b)
Les imports de module peuvent être relatifs
Ajout des méthodes partition() et rpartition() aux chaînes str et unicode
Ajout des fonctions any() et all()
Intégration des bibliothèques ctypes, ElementTree, hashlib, sqlite3 et wsgiref
2.6
(mises à jour de sécurité jusqu'au )
Nouvelle syntaxe de formatage de chaînes de caractères
Classes de bases abstraites
Décorateurs de classes
Modules JSON, multiprocessing, contextmanager et fractions
Amélioration de la compatibilité avec Python 3
2.7
Syntaxe pour les ensembles littéraux : {1, 2, 3} au lieu de set((1, 2, 3))
Compréhension de dictionnaire et d'ensemble, exemples : {i: i*2 for i in range(3)} (dictionnaire) et {i*2 for i in range(3)} (ensemble)
Possibilité de spécifier plusieurs gestionnaires de contexte avec une seule déclaration with
Réimplementation de la bibliothèque io (entrées/sorties) en C pour offrir de meilleures performances. Cette bibliothèque est notamment utile pour accéder à un fichier texte en Unicode.
Dictionnaires ordonnés comme décrits dans la PEP 372 : from collections import OrderedDict
La méthode format gère la numérotation automatique : '{} {}!'.format('Hello', 'World') donne 'Hello World'!
Le formatage des nombres gère les séparateurs de milliers, exemple : '{:,}'.format(10800) donne '10,800'
Amélioration de précision lors des conversions chaîne vers flottant et flottant vers chaîne. Pour un flottant, float(repr(x)) donnera toujours x.
Nouveau module argparse pour parser la ligne de commande : version améliorée du module optparse
Configuration basée sur des dictionnaires pour le module logging
Objets memoryview : vue en lecture seule ou lecture-écriture d'un objet binaire (API similaire à celle du type bytes)
Type PyCapsule pour l'API C (pour les modules d'extension)
Les types int et long gagnent une méthode bit_length() : nombre de bits nécessaires pour représenter la valeur absolue du nombre
ajout de la syntaxe await et async pour la programmation asynchrone
création du module typing qui fournit une API pour le type hinting en ajoutant des outils tels que Callable, Generic, TypeVar, etc. Voir la PEP 484 pour les détails
Support des variables de contexte via le nouveau module contextvars[89].
async et await font maintenant partie officiellement des mots-clefs réservés, même s'ils étaient déjà considérés comme tel par nombre de lexers et faisaient partie du langage depuis Python 3.5[90].
ajout d'une nouvelle fonction intégrée : breakpoint() permettant une meilleure insertion de points d'arrêt[91].
le module time a maintenant un support pour les nanosecondes grâce à la méthode time.time_ns() ainsi que d'autres méthodes notamment de l'objet clock[92].
3.8
(mises à jour de sécurité jusqu'en )
Cette section est vide, insuffisamment détaillée ou incomplète. Votre aide est la bienvenue ! Comment faire ?
Dernière version supportant Windows 7.
3.9
(mises à jour de sécurité jusqu'en )
Support de l'opérateur union pour les dictionnaires[93]
Nouvelles méthodes de suppression des préfixes et/ou suffixes pour les chaînes de caractères[94]
Ajout de TypeAlias qui permet de définir sans ambiguïté un alias de type[101]
Ajout du paramètre strict (par défaut à False) à la fonction zip permettant de relever une ValueError si les listes n'ont pas le même nombre d'éléments [102]
Amélioration du débugger en spécifiant la ligne qui pose un problème [103]
Possibilité (seulement en passant par C mais prévu pour Python en 3.13) d'avoir un unique GIL par interprète[115]
Nouvelle API pour les outils tels que les debuggers ou les profilers, permettant de directement surveiller les événements dans Cpython avec un coût faible en performance[116]
Concernant les annotations de type :
Nouvelle manière plus concise et compacte de définir des fonctions et classes génériques. De même pour les alias de type via la nouvelle instruction type[117]
Possibilité d'utiliser un TypedDict pour spécifier le typage de **kwargs[118]
3.13
Développement
Les PEP
Les propositions d'amélioration de Python (ou PEP : Python Enhancement Proposal) sont des documents textuels qui ont pour objet d'être la voie d'amélioration de Python et de précéder toutes ses modifications[119]. Un PEP est une proposition d'orientation pour le développement (process PEP), une proposition technique (Standard Track PEP) ou une simple recommandation (Informational PEP). La PEP la plus connue est la PEP 8 pour son guide sur le style de code.
Python 3
En 2009, c'est la version 3 de Python, qui remplace de plus en plus la version 2 (le projet était au départ appelé « Python 3000 » ou « Py3K »), sans compatibilité descendante avec la série des versions 2.x, dans le but d'éliminer les faiblesses du langage. La ligne de conduite du projet était de « réduire la redondance de Python par la suppression de méthodes obsolètes ». Python 3.0a1, la première version alpha, avait été publiée le [120], et il existe un PEP[121] qui détaille les changements prévus, ainsi qu'une page pour orienter les programmeurs dans leur choix de Python 2 ou 3[122].
Python 3 a été développé avec la même philosophie que dans ses versions antérieures, donc toute référence à la philosophie de Python s'appliquera aussi bien à la version 3. Cependant, le langage avait fini par accumuler nombre de méthodes redondantes. En recherchant à supprimer ce qui est redondant dans le langage et ses modules, Python 3 suit la ligne directrice de Python « Ne devrait subsister qu'une seule méthode à la fois optimale et naturelle pour chaque chose ».
Python 3 reste un langage multiparadigme. Les programmeurs auront encore le choix entre l'orientation objet, la programmation structurée, la programmation fonctionnelle et d'autres paradigmes ; Python 3 a pour but d'être utilisé de manière plus naturelle que dans les versions 2.x, bien que son print nécessite l'emploi de parenthèses contrairement à Python 2.
Planning et compatibilité
Python 3.0a1, la première version alpha de Python 3.0, fut publiée le . Les versions 2.x et 3.x de Python seront publiées en parallèle pendant plusieurs cycles de développement, pendant lesquels la série des 2.x subsistera principalement pour la compatibilité, en incluant quelques caractéristiques importées depuis Python 3.x. Le PEP 3000[124] contient plus d'informations à propos du processus de publication d'une version.
Comme Perl 6, Python 3.0 rompt la compatibilité descendante (rétrocompatibilité). L'utilisation de code écrit pour les séries 2.x n'est pas garantie avec Python 3.0. Ce dernier apporte des changements fondamentaux, comme le passage complet à l'Unicode et pour cette raison une nécessaire distinction entre les chaînes de caractère et les objets « bytes ». Le typage dynamique associé à certaines méthodes sur les objets de type dictionnaire rend une transition parfaite de Python 2.x vers Python 3.0 très délicat. Un outil nommé « 2to3 » traduit le plus gros des versions 2.x vers les versions 3.x et indique les zones de code demandant des finitions par des commentaires spéciaux et des mises en garde.
Dans sa préversion, 2to3 semble réussir franchement à réaliser une traduction correcte[125]. Dans le cadre d'une migration de Python 2.x vers Python 3.x, le PEP 3000 recommande de conserver le code original comme base des modifications et de le traduire pour la plateforme 3.x en utilisant 2to3.
Python 2.6 fournit un début de compatibilité ascendante, aussi bien qu'un mode « mise en garde » qui devrait faire prendre conscience des problèmes potentiels de transition pour le passage à Python 3[126].
Python pour smartphones
Il existe des versions de Python adaptées pour Android et iPhone en version 2.5 ou 2.6. Disponible en Jailbreak d'iOS sur iOS grâce à "setup tools", et sur Android grâce à SL4A qui donne même une possibilité de faire des petites interfaces graphiques grâce au module "android" et qui permet d'envoyer des SMS, d'allumer la caméra[127], ou encore de faire vibrer le téléphone. Les quelques lignes suivantes montrent comment faire ça :
droid=android.Android()# client lié au serveur local lancé par l'application SL4A# pour contrôler un téléphone distant à l'adresse 192.168.0.5, avec SL4A lancé sur le port 9887# il suffit de faire : android.Android('192.168.0.5', 9887)droid.vibrate(2.5)# fait vibrer le téléphone (local ou distant) pendant 2.5 secondes
Un portage de Python sur les terminaux Blackberry est sorti en , pour le système BlackBerry OS 10[128]. Une version allégée est sortie en , appelée « BlackBerry-Tart »[129],[130], en raison d'un jeu de mots en anglais : « a "tart" is lighter-weight than a "pie" », en référence à la traditionnelle « apple pie ». Elle est basée sur Python 3.2.2.
↑(en) Mark Lutz, Learning Python : Powerful Object-Oriented Programming, O'Reilly Media, Inc., , 1216 p. (ISBN978-1-4493-7932-2, lire en ligne), « How Does Python Stack Up to Langage », p. 17.
↑Selon le fichier HISTORY mais la plus ancienne version accessible dans les archives du forum est la
0.9.1, également disponible en tarball sur python.org.
↑Les objets bytes ont été introduits par le PEP 358, voir aussi le PEP 3137.
↑Les compréhensions ont été introduites dans le PEP 202 en juillet 2000, et les compréhensions de dictionnaires et d'ensembles dans le PEP 274 en octobre 2001.
↑Kim Barrett, Bob Cassels, Paul Haahr, David A. Moon, Keith Playford et P. Tucker Withington, « A monotonic superclass linearization for Dylan », ACM SIGPLAN Notices, vol. 31, no 10, , p. 69-82 (DOI10.1145/236337.236343, lire en ligne).
Luciano Ramalho, Programmer en Python : Apprendre la programmation de façon claire, concise et efficace [« Fluent Python: Clear, concise and effective programming »], O'Reilly,