Python est apprécié par lespédagogues qui y trouvent unlangage où la syntaxe, clairement séparée des mécanismes debas niveau, permet uneinitiation aisée[8] aux concepts de base de la programmation[9].
Cette initiation commence généralement au début du lycée en classe de seconde. Les élèves souhaitant approfondir le sujet peuvent choisir un enseignement de spécialité Numérique et sciences informatiques[10] (NSI).
Les calculatrices supportant Python[10] destinées aux lycéens fonctionnent en Python 3. Ces calculatrices peuvent échanger des programmes avec desordinateurs personnels.
14 000 lycéens participent à la Nuit du code[11], un challenge à partir de la classe de première NSI pour créer un jeu en 6 heures avec le moteurPyxel de Python. À Berlin[12] etTokyo[13], les lycées français internationaux (LFI) participent à l'évènement.
Python est utilisé comme langage de programmation dans l'enseignement secondaire et supérieur, notamment en France[19]. Depuis 2013, il y est enseigné à tous les étudiants declasses préparatoires scientifiques dans le cadre du tronc commun (informatique commune). Auparavant, l'enseignement d'informatique était limité à une option enMP, l'enseignement se faisant en langageCaml ouPascal[20]. Cette option existe toujours, mais Pascal a été abandonné à partir de la session 2015 des concours et Caml a, lui, été enlevé au profit deOCaml dans cet enseignement. Les premières épreuves de concours portant sur le langage Python sont également celles de la session 2015[21],[22].
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. Entre le[29] et le[1], la première version publique, numérotée 0.9.0[30], immédiatementpatchée en 0.9.1[31],[29], est postée sur le forumUsenet[25] alt.sources.
Au CNRI, l'équipe Python travaille sur lenavigateur web expérimentalGrail[32] utilisant Tcl/Tk. Il est l'équivalent pour Python du navigateurHotJava, permettant d'exécuter desapplets dans un environnement sécurisé[33]. Il entraîne le développement demodules pour la bibliothèque standard de gestion deHTML.
En1999, le projetComputer Programming for Everybody[34] (CP4E) est lancé conjointement entre le CNRI et laDARPA. Il s'agit d'utiliser Python comme un langage d'enseignement de laprogrammation. Cette initiative conduira à la création de l'environnement de développement dénomméIDLE.
En, Andrew M. Kuchling, le manager pendant une décennie des versions de Python 2.0[35] à 2.7[36], publie une critique dénommée "Les bizarreries de Python" (Python Warts[37]), 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[38].
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 IDLE s'éteint en 2000[34]. Python 1.6 est la dernière version sortie au CNRI.
En2000, l'équipe principale de développement de Python déménage à BeOpen pour former l'équipe PythonLabs à l’origine de Python 2.0. Après cette version, Guido van Rossum et les autres développeurs de PythonLabs rejoignent Digital Creations à présent connue sous le nom deZope Corporation[39].
En 2020, Guido van Rossum entre dans la division développeur chez Microsoft[7].
Selon l'Index TIOBE,« Python, qui est devenu un élément incontournable de lascience des données, duDevOps et dudé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 »[46], notamment en raison de son efficacité pour l'apprentissage automatique.
En août 2025, Python occupe la première place de ce classement[47].
Python a été conçu pour être un langage lisible. Il vise à être visuellement épuré. Par exemple, il possède moins de constructionssyntaxiques que des langages structurés tels queC,Perl, ouPascal. Les commentaires sont indiqués par le caractèrecroisillon#[48].
Lesblocs sont identifiés par l'indentation[49], au lieu d'accolades comme enC ouC++ ; ou debegin ... end comme enPascal ouRuby. 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, l'indentation est de quatre espaces en Python selon le standard de codage PEP 8[50].
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[51]. 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 listekeyword.kwlist du modulekeyword[52].
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 etexec ne sont plus des mots-clés du langage, mais des fonctions du modulebuiltins[53]. Sont ajoutés aux mots-clés :True,False,None etnonlocal. Les trois premiers étaient déjà présents dans les versions précédentes, mais ils ne sont plus modifiables (auparavant, l'affectationTrue = 1 était possible)[54].nonlocal a été introduit par le PEP 3104[55], et permet, dans une fonction définie à l'intérieur d'une autre fonction, de modifier une variable d'un niveau supérieur deporté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éthodeappend - c'est évidemment impossible pour unobjet 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éfaut
Les types de base en Python sont relativement complets et puissants. Il y a, entre autres :
Les objetsnumériques :
int est le type desentiers relatifs. Avant la version 3.0, ce type était dénommélong, et le typeint correspondait à un entier de 32 ou 64 bits. Néanmoins, uneconversion automatique en typelong évitait toutdé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 typeint en Python 3.
float est le typeflottant équivalent au typedoubledu 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 desnombres complexes (c'est-à-dire deuxfloat).
Les objetsitérables sont parcourus à l'aide d'une bouclefor de la manière suivante :
forelementinobjet_iterable:traiter(element)
bytearray est une chaîne d'octets modifiables. La version d'Unicode employée par Python peut être déterminée à l'aide de la variableunidata_version du moduleunicodedata.
dict est un dictionnaire outableau associatif pour associer chaque clef unique à un objet. Ses méthodes sont.keys(),.values() ou.items().
enumerate() énumère un objet itérable tel qu'une liste. Par rapport à la bouclefor, il renvoie à la fois l'index[56] et la valeur. L'objet énuméré n'est pas modifiable : il est ditimmuable.
file correspond à un fichier obtenu grâce à la méthodewith open('c:\tool\python\pep-343.html', 'r') as file:
frozenset forme une variante immuable d'unset.
list est untableau dynamique qui étend automatiquement sa taille lorsque nécessaire et accepte des types de données hétérogènes.
range(nbr) est un compteur. Il génère une séquence de nombres de 0 à nbr - 1.
set est un ensemble non ordonné d'objets.
str est une chaîne de caractères itérable caractère par caractère. À partir de la version 3.0, les caractères sont en Unicode sur 16 ou 32 bits ; les chaînes d'octets sont des objetsbytes[57],[58]. Dans les versions précédentes, ces objets étaient respectivement de typeUnicode etstr. Les objetsstr etbytes sont immuables.
tuple (n-uplet) est une liste immuable d'objets de types pouvant être différents c'est-à-dire hétérogènes.
typename est obtenu avec la fonctionnamedtuple(). C'est une variante destuple permettant d'accéder à un élément du tuple avec un nom se comportant comme une variable. Contrairement auxdict, ces objets sont immuables[59],[60].
Les autres objets ne sont ni numériques ni itérables :
bool est un booléen, soit le type deTrue etFalse renvoyés par exemple lors de comparaisons hors de l'utilisation de méthodesis_x().
exception est le type d'unmessage d'erreur lancé lorsque le code lève une exception.
function est le type d'une fonction, utilisé lors de l'appel des mots-clefdef etlambda.
module est le type d'un module, utilisé lors de l'appel des mots-clefimport etfrom.
None sert à dénoter qu'une variable est vide.
NotImplementedType indique une absence d'implémentation du type auquel on essaie d'accéder.
object est le type basique dont tous les autres types « héritent ».
slice est une partie de type ou un objet extensible.
type est le type du type des objets, obtenu grâce à la méthodetype().
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.
Python permet de programmer dans un stylefonctionnel. Il dispose également descompréhensions de listes, et plus généralement les compréhensions peuvent produire des générateurs, desdictionnaires ou desensembles[61],[62]. Par exemple, pour construire la liste des carrés desentiers naturels plus petits que 10, on peut utiliser l'expression :
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'instructionsfor etif :
n=6;lstRes=[]# La liste résultat est videforiinrange(n):# avec ":"ifi%2!=0:# impaire ?forjinrange(n):ifj%3!=0:lstRes.append(i+jifi!=jelse0)# lstRes = [0, 3, 5, 6, 4, 5, 7, 8, 6, 7, 9, 0]
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 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 avecdef peut être créée à l'intérieur d'une autre fonction et on obtient ainsi une définition de fonction dans unevariable locale, par exemple :
Une fonction locale peut modifier l'environnement de la fonction qui l'a créée, grâce au mot-clénonlocal (voirFermeture (informatique)) :
fromtypingimportCallable# type le retour de fonctiondefaccum(pas)->Callable[[int],int]:# retourne une fonction appelabletotal=0# initialise une fois l'accumulateurdefajoute(germe)->int:nonlocaltotal# accède à l'accumulateur de la fonction accumtotal+=germe*pas# incrémente l'accumulateur du germe fois le pasreturntotal# retourne la valeur accumuléereturnajoute# retourne la fonction accumulateur paramétrée par le paspaire=accum(2)# retourne la fonction ajoute avec un pas de 2assertisinstance(paire,Callable)# paire est une fonction appelableprint([cell.cell_contentsforcellinpaire.__closure__])# environnement initial : [2, 0]print([paire(1)for_inrange(5)])# affiche la liste des cinq premiers nombres pairs# [2, 4, 6, 8, 10]print([paire(1)for_inrange(3)])# affiche la suite à partir du dernier compteur précédent# [12, 14, 16]print([cell.cell_contentsforcellinpaire.__closure__])# environnement final : [2, 16]
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__.
Tous les types de base, les fonctions, lesinstances de classes (les objets « classiques » des langagesC++ etJava) 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. Lesclasses 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 etorienté 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 fonctionprint.
Les possibilités sont nombreuses et sont décrites dans la documentation du langage[63].
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)
Le mot-clefyield utilisé dans une fonction permet de faire de cette fonction un générateur. L'appel de cette fonction renvoie un objet de typegenerator, qui peut être utilisé dans une bouclefor, par exemple.
À chaque appel, le générateur effectue son traitement jusqu'à rencontrer le mot-cléyield, renvoie la valeur de l'expressionyield, et à l'appel suivant, reprend son déroulement juste après leyield. Par exemple pour calculer lasuite 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()print([next(fi)for_inrange(7)])# renvoie [0, 1, 1, 2, 3, 5, 8]print([next(fi)for_inrange(3)])# renvoie [13, 21, 34]
Le moduleitertools 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 syntaxeyield from, apparue dans le PEP 380[64] et qui « délègue » le calcul à un sous-générateur. L'exemple suivant calcule les permutations des dames correspondant aux solutions duproblème des huit dames étendu à un échiquier de taille n × n.
Problème des huit dames
defQueenSolver(nbrFile,lstColumn=[]):'''Résoudre nbrFile Dames sans prise sur un échiquier de nbrFile colonnes'''if(nbrRank:=len(lstColumn))==nbrFile:yieldlstColumn# Solution itérable trouvéeelse:forindFilein[colforcolinrange(1,nbrFile+1)ifcolnotinlstColumn]:isQueenUnderAttack=False;indRank=nbrRankforcolinlstColumn:ifcolin[indFile+indRank,indFile-indRank]:# Collision ?isQueenUnderAttack=True;break# colonne col à rejeterindRank-=1# Rangée précédenteifnot(isQueenUnderAttack):# Dame non attaquée ?# appel récursif en insérant dans la liste la Dame en indFileyield fromQueenSolver(nbrFile,lstColumn+[indFile])sum(1for_inQueenSolver(8))# Nombre de solutions# renvoie 92
# ChessCoord([8, 4, 1, 3, 6, 2, 7, 5]) -> "h8, d7, a6, c5, f4, b3, g2, e1"defChessCoord(lstColumn)->str:"""Convertit une liste de colonnes en notation algébrique"""return", ".join(# chr(ascii) -> str; ord(str) -> asciif"{chr(indFile+ord('a')-1)}{8-indRank}"# Boucle sur le rang et colonne dans lstColumnforindRank,indFileinenumerate(lstColumn))forsolutioninQueenSolver(8):# Pour chaque solutionprint(ChessCoord(solution))# afficher la notation algébrique
Un générateur peut sembler identique à une fonction qui retourne une liste parreturn, mais contrairement à une liste qui contienttous ses éléments, un générateur calcule ses élémentsun par un.
importtimeit# chronomètre[n*nforninrange(10)]# une liste est entre crochets# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]36in[n*nforninrange(10)]# 36 est-il dans la liste des carrés ?# True(n*nforninrange(10))# un générateur est entre parenthèses# <generator object <genexpr> at 0x0000022DCAED1490> # l'adresse hexadécimale peut changer36in(n*nforninrange(10))# 36 est-il dans un des premiers résultats du générateur ?# Truetimeit.timeit(stmt='36 in [n * n for n in range(100)]',number=1_000_000)# quand range(maxNbr) augmente,# 7.3 stimeit.timeit(stmt='36 in (n * n for n in range(100))',number=1_000_000)# le générateur peut être plus rapide.# 1.2 s
Ainsi, le test36 in [n * n for n in range(10)] va s'effectuer sur la liste calculée en entier, alors que dans36 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çantn * n par un appel de fonction réalisant uneffet de bord, par exemple un affichage à l'écran.
Grâce à un usage intensif des dictionnaires (conteneur associatif développé avec destables de hachage), Python permet d'explorer les divers objets du langage (introspection) et dans certains cas de les modifier (intercession).
Letypage estdynamique[68]. Il n'est pas vérifié à la compilation mais à l'exécution.Il n'est pas nécessaire d'indiquer le type des variables : Python est sans typage statique explicite.
Python est fortement typé. Il interdit à l'exécution des opérations ayant peu de sens.Par exemple : concaténer par l'opérateur+ un nombre réel ou entier à une chaînestr pour l'afficher avecprint().
Il n'y a pas de conversion automatique.Python propose les fonctionsint() etstr() permettant de convertir un nombre dans un autre type :
floatPoint=3.2# Python découvre dynamiquement que floatPoint est du type floatprint("Tu as "+floatPoint+" points !")# Génère l'erreur de typage :# TypeError: can only concatenate str (not "float") to str# intPoint est du type int : entier. La fonction int() force la conversion.intPoint=int(floatPoint)# Sa valeur 3 est arrondie à l'unité inférieure.print("Tu as "+intPoint+" points !")# TypeError: can only concatenate str (not "int") to strstrPoint=str(intPoint)# strPoint est du type str : chaîne de caractèresprint("Tu as "+strPoint+" points !")# affiche "Tu as 3 points !"'
En pratique, il n'est pas utile de préfixer les noms de variables par leur type.La conversion d'un nombre versstr est automatique avec une chaîne préfixée parf en mettant la variable entre accolades à l'intérieur de la chaîne sans opérateur+ :
nbrPoint=3.2# Python reconnaît dynamiquement que nbrPoint est du type floatprint(f"Tu as{nbrPoint} points.")# affiche "Tu as 3.2 points."print(f"Tu as{int(nbrPoint)} points.")# affiche "Tu as 3 points."print(f"Tu as{nbrPoint:.0f} points.")# affiche "Tu as 3 points." avec zero décimale
Python utilise le typage dynamique dénomméduck typing : lors de l'exécution, si une méthode invoquée sur un objet a la mêmesignature 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.
Depuis la version 3.0, Python propose l'annotation des variables dans les fonctions (introduit dans la PEP 3107[70]). 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[71].
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[72] (introduit dans la PEP 484[73]).
Il est possible d'effectuer une analyse statique des modules Python avec des outils comme Pylance[74], Pylint[75], mypy[44], 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__.
L'outil ligne de commande PyInstaller[76] ou ses variantes (auto-py-to-exe, cx_Freeze, py2app sous macOS oupy2exe sous Windows) permettent de « compiler » un programme Python sous forme d'un exécutable comprenant le programme, l'interpréteur Python et toutes ses bibliothèques.
L'inconvénient est le poids de l'exécutable. Le programme ne tourne pas plus rapidement car il n'est pas compilé sous forme de code machine.
L'avantage est que tout est compris dans l'exécutable : cela simplifie sa distribution, notamment sur une autre machine où Python n'est pas installé.
Le modèle objet de Python est inspiré de celui de Modula-3[28]. Parmi ces emprunts se trouve l'obligation de déclarer l'instance de l'objet courant, conventionnellement nomméeself, 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 desself étant souvent critiquée comme étant une pollution visuelle qui gêne la lecture du code. Les promoteurs duself 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[78].
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éthodefromkeys() de l'objetdict. 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.
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 commeprotected ouprivate.
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 desécurité informatique. Le modulebastion 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 estwe're all consenting adults here[79] (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 fonctionproperty() 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 grandebibliothè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 queMIME etHTTP). Des modules pour créer desinterfaces graphiques et manipuler desexpressions rationnelles sont également fournis. Python inclut également unframework detests unitaires (unittest, anciennementPyUnit avant version 2.1) pour créer des suites de tests exhaustives.
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[50],[75]. Publié en 2001, il est toujours maintenu pour l'adapter aux évolutions du langage.Google propose également un guide[82].
Python possède plusieurs modules disponibles pour la création de logiciels avec uneinterface graphique. Le plus répandu estTkinter[83]. 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'autresbibliothèques logicielles (« toolkit »), pour davantage de fonctionnalités, pour une meilleure intégration avec lesystè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 sontTkinter et Pmw[84] (Python megawidgets) pourTk,wxPython pourwxWidgets,PyGTK pourGTK,PyQt etPySide pourQt, et enfin FxPy pour leFOX Toolkit. Il existe aussi une adaptation de la bibliothèqueSDL :Pygame, unbinding de laSFML : PySFML, ainsi qu'une bibliothèque écrite spécialement pour Python :Pyglet.
Il est aussi possible de créer des applicationsSilverlight en Python sur la plateformeIronPython.
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[85]) « par intérim[24] ». 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[86]. Par la suite, en, il a également retiré sa candidature au conseil directeur du langage Python[87].
Après le retrait de van Rossum, la gouvernance de Python est passée à un modèle plus démocratique, sous la direction d'unConseil directeur composé de cinq membres élus. Ces membres sont principalement issus de la communauté descore developers, une équipe de développeurs ayant un accès en écriture au dépôt deCPython, l'implémentation de référence du langage Python. Cette équipe se coordonne principalement via laliste 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âchesRoundup, qui a remplacé l'ancien système basé surSourceForge. La transition versGitHub 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 commeReddit ouDiscord.
Les références aux Monty Python[27], une troupe comique britannique, sont un élément récurrent dans la culture Python[88]. Illustrant l'humour décalé[89] et omniprésent dans la communauté Python, la documentation du langage utilise souvent les termesspam eteggs commeespace réservé, en référence au célèbre sketchSpam desMonty Python, où le SPAM (un jambon en conserve) est le leitmotiv du menu truffé d'expressions en français. Ce sketch a d'ailleurs donné son nom au phénomène ducourriel non sollicité[90].
Les résultats peuvent différer par rapport à la documentation officielle de Python[91] :
Command-lineexampleHerearesomeexamplesoftherandomcommand-lineinterface:PSC:\Tool\python># Choose one at randomPSC:\Tool\python>python-mrandomeggbaconsausagespam"Lobster Thermidor aux crevettes with a Mornay sauce"spamPSC:\Tool\python>python-mrandomeggbaconsausagespam"Lobster Thermidor aux crevettes with a Mornay sauce"eggPSC:\Tool\python># With explicit argumentsPSC:\Tool\python>python-mrandom--choiceeggbaconsausagespam"Lobster Thermidor aux crevettes with a Mornay sauce"LobsterThermidorauxcrevetteswithaMornaysauce
Plusieurs entreprises ou organismes mentionnent sur leur site officiel[92] qu'elles utilisent Python :
Google utilise Python comme langage principal parmi les langages dynamiques[82].Guido van Rossum a travaillé au sein de cette entreprise entre 2005 et 2012[93] ;
Microsoft : depuis 2020, Guido van Rossum a rejoint cette entreprise[7] ;
RustPython est un interpréteur Python 3 enRust[102] ;
PySpark est une interface de programmation permettant d'utiliserSpark à partir du langage Python pour faire descalculs 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 despaquets dédiés à un domaine donné :
La version officielle[103],[104] de la fondation logicielle Python. Les bibliothèques complémentaires sont à installer à la demande avec pip, conda ou poetry.
ActivePython[77] : disponible en version gratuite (ne pouvant être « utilisée en production ») ou commerciale.
Enthought(en) Canopy : distribution commerciale à usage scientifique, disponible en version gratuite sous le nom de Canopy Express[105].
Anaconda ou Miniconda[106] optimisée en taille : distribution à usage scientifique, disponible en version gratuite ou commerciale.
Pyzo : distribution scientifique destinée à être facile d'utilisation[107].
WinPython[108] : distribution à usage scientifique avec l'éditeurSpyder.
Ce ne sont pas desimplémentations différentes du langage Python : elles sont basées sur la référence CPython, mais sont livrées avec plus ou moins de bibliothèques préinstallées. Ces modules tiers[7] peuvent être en versions différentes d'une distribution à l'autre, introduire des contraintes de dépendance ou avoir des cycles de développement propres qui peuvent ne pas être synchronisés avec la dernière version officielle.
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[109]. 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[50] pour son guide sur le style de code.
L'historique présente un extrait des nouveautés majeures du logiciel Python par version avec la date de début de sortie et celle de fin de support. Les mises à jour de sécurité sont assurées jusqu'à la date entre parenthèses.
Chaque nouveauté correspond à une proposition d'amélioration de Python (PEP) acceptée dont le numéro apparaît en dernière colonne. Ce tableau n'est pas exhaustif. Se reporter, en première colonne, à chaque version pour l'ensemble des liens des PEP avec leurs auteurs.
Historique déroulable des versions
Version
Début
Fin
Nouveautés majeures
PEP
Ancienne version, plus prise en charge : 1.5.2[110]
Ajout du mot cléassert
import spam.ham.eggs importe une hiérarchie de modules
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[141]. Le PEP 3000[142] détaille les changements prévus. Les programmeurs en Python 2 sont incités à migrer vers la version 3[143].
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 optimaleet 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 sonprint nécessite l'emploi de parenthèses contrairement à Python 2.
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[142] contient plus d'informations à propos du processus de publication d'une version.
CommePerl 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 transitionparfaite de Python 2.x vers Python 3.0 très délicate. 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[144]. 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 letraduire pour la plateforme 3.x en utilisant2to3.
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[145].
importandroid# possibilité de faire des petites interfaces graphiques# telephone localdroid=android.Android()# client lié au serveur local lancé par l'application SL4Adroid.vibrate(3)# fait vibrer le téléphone pendant trois secondesresult=droid.smsSend(phoneNbr,"SMS")# envoyer un SMSdroid.cameraInteractiveCapturePicture("/sdcard/picture.jpg")# allumer la caméra# téléphone distant à l'adresse 192.168.0.5, avec SL4A lancé sur le port 9887# android.Android('192.168.0.5', 9887)
Le, la réalisatrice danoise Ida Lærke Bechtle[150] présente son long métrage « Python : Le documentaire. Une histoire d’origine » (Python: The Documentary. An origin story) à la conférence PyCon à Athènes[151].
Le film est produit par Cult.Repo[152] à Berlin en relation avec la société irlandaise Open Source World Films Limited : Emma Tracey est créditée au générique.
Pendant une année[150], le tournage se déroule aux Pays-bas, États-Unis, Canada et en Australie.
Ida Bechtle donne la parole à la communauté féminine[153] de Python ouverte à la diversité[154] :
PyLadies.
Mariatta Wijaya anime des conférences PyCascades surPyLadies[155]. Elle a été présidente de la conférence PyCon US. Elle est l'autrice des PEP 588 et PEP 8001 ;
Lisa Guo[94] est interviewée sur la migration de Python chez Instagram ;
Lisa Roach[157] relate comment elle a résolu la migration de Python 2 vers la version 3 dans les applications de Meta. Elle est l'autrice du PEP 526. C'est une oratrice régulièrement invitée aux conférences sur Python.
Ida Bechtle capture l'humanité desPythonistas[158] (utilisateur),Pythoneers[158] (expert) et fondateurs qui lui ont ouvert leurs portes sur les lieux de naissance du langage :
Barry Warsaw (CNRI, NIST,GNU Mailman, Microsoft[159], PSF, PEP 1, PEP 8000[85]) ;
Ken Manheimer (CNRI, NIST, GNU Mailman) est le créateur[160] du termeBDFL. Il cite Wikipedia à 00:18:55s ;
Tim Peters(en) (PEP 20[161], PEP 572[128], PEP 8001),évangeliste[23] (advocative) Python de la première heure, est crédité pour l'import du module dénomméthis :
importthis# Affiche :
« TheZen of Python, by Tim Peters[79] ». Il a donné les documents originaux sur Python à la réalisatrice pour le montage du film[162].
Ida Bechtle confie à Barry Warsaw la strophe « même si, de prime abord, elle n'est pas évidente, à moins d'être Néerlandais. ».
Brett Cannon[159] (Microsoft[163], PSF, PEP 2, PEP 758, PEP 8001) évoque Python pour l'atterrissage sur Mars avec un parachute. Dans l'initiation sur Python par la NASA, les enfants de 12 ans apprennent à coder du morse[164] lors de l'atterrissage martien. Barry Warsaw fait tourner la tête à l'opérateur morse:= du PEP 572.
Guido van Rossum (CWI, CNRI, PSF, PEP 8, PEP 572, Microsoft, PEP 750[139]) accepte la controversée[165] PEP 572[128]. Affecté par la rage des débats, il tire un trait sur ses activités de BDFL[7] mises en pointillées par le stress[24].
Guido van Rossum se tourne vers d'autres fenêtres[7]. Il rejoint l'équipe composée de Brett Cannon, Steve Dower[166] (CPython, PEP 731, PEP 8013) et Barry Warsaw[159].
Tel le père Noël de ce pittoresquecirque volant au-dessus des continents « à l'exception de l'Antarctique », Barry Warsaw referme la parenthèse du générateur pythonique[79] jaillissant avec peps dans l’esprit de Guido van Rossum.
↑« 1. Mise en bouche », surpython.org,(consulté le) :« Faire référence aux sketchs des Monty Python dans la documentation n'est pas seulement permis, c'est encouragé ! »