Cet article présente les principales distinctions entre Python version 2.x et Python version 3.x, essentielles pour la migration et la compatibilité des projets.
- Instruction d'affichage
En Python 2.6 et antérieur, l'affichage se faisait uniquement avec la syntaxe suivante :
afficher "Bonjour"
À partir de Python 3.0, la fonction print() devient obligatoire :
afficher("Bonjour")
- Encodage par défaut
Python 2.x utilise l'encodage ASCII par défaut, nécessitant des déclarations explicites pour gérer les caractères non-ASCII :
# coding:utf-8
texte = "À bientôt"
print(texte.decode("utf-8"))
Python 3.x adopte l'Unicode UTF-8 comme encodage standard, permettant une utilisation directe des caractères spéciaux sans conversion.
- Opérations de division
Dans Python 2.x, la division entière produit un résultat entier (arrondi vers le bas) :
resultat = 15 // 4
print(resultat) # Affiche 3
Python 3.x modifie ce comportement : la division standard (/) renvoie toujours un flottant :
valeur = 20 / 5
print(valeur) # Affiche 4.0
L'opérateur // conserve le comportement d'arrondi inférieur dans les deux versions.
- Gestion des exceptions
Python 2.x permettait une syntaxe plus flexible pour attraper des exceptions :
try:
operation_risque()
except Exception, erreur:
gerer_erreur(erreur)
Python 3.x impose l'utilisation du mot-clé as et restreint le lancement d'exceptions aux objets héritant de BaseException :
try:
operation_risque()
except Exception as exc:
traiter_exception(exc)
- Fonctions de génération de séquences
Python 2.x propose xrange() pour générer des séquences efficaces en mémoire :
sequence = xrange(0, 10, 2)
print(list(sequence)) # [0, 2, 4, 6, 8]
Python 3.x unifie cette foncitonnalité sous range(), qui retourne directement un objet générant des valeurs à la demande.
- Entrées utilisateur
Python 2.x distinguait raw_input() (retourne une chaîne) et input() (évalue l'expression) :
saisie = raw_input("Entrez une valeur : ")
Python 3.x fusionne ces fonctions : input() retourne systématiquement une chaîne, éliminnat les risques d'exécution involontaire.
- Types de données
Python 3.x établit une séparation stricte entre str (texte Unicode) et bytes (données binaires). La conversion doit être explicite :
texte = "Données"
octets = texte.encode('utf-8')
texte_recupere = octets.decode('utf-8')
De plus, le type long disparaît au profit d'un entier int à capacité étendue.
- Programmation fonctionnelle
En Python 2.x, map() et filter() retournent des listes :
resultats = map(lambda x: x**2, [1, 2, 3]) # Retourne [1, 4, 9]
Python 3.x optimise la mémoire : ces fonctions retournent des itérateurs paresseux. reduce() est déplacé dans le module functools.
- Mots-clés pour les coroutines
Python 3.3 introduit yield from et Python 3.5 ajoute async/await, facilitant la programmation asynchrone. Ces mécanismes n'existent pas dans Python 2.x.
- Classes et méta-classes
Python 2.x distinguait les classes classiques et les nouvelles classes (héritant explicitement de object) :
class MaClasse(object):
pass
Python 3.x unifie la syntaxe : toutes les classes sont des nouvelles classes. La définition des méta-classes utilise également une syntaxe révisée.
- Portée des variables
Python 2.x ne permet pas de modifier une variable globale depuis une fonction imbriquée. Python 3.x introduit nonlocal :
def fonction_principale():
compteur = 0
def fonction_interne():
nonlocal compteur
compteur += 1
fonction_interne()
return compteur # Retourne 1 en Python 3.x
- Syntaxe des méta-classes
La déclaration des méta-classes évolue entre les versions :
# Python 2.x
class MetaClasse(type):
pass
class MonObjet:
__metaclass__ = MetaClasse
# Python 3.x
class MetaClasse(type):
pass
class MonObjet(metaclass=MetaClasse):
pass
- Évolution des modules
Python 3.x supprime certains modules obsolètes, en introduit de nouveaux comme asyncio pour l'asynchronisme, et renomme d'autres (Queue devient queue).