13 différences fondamentales entre Python 2.x et Python 3.x

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.

  1. 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")
  1. 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.

  1. 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.

  1. 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)
  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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
  1. 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
  1. É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).

Étiquettes: Python 2 Python 3 migration syntaxe encodage

Publié le 16 juin à 23h06