Python est un langage de programmation polyvalent et interprété, de haut niveau et à usage général. Il a été créé par Guido van Rossum et publié pour la première fois en 1991. La philosophie de conception de Python met l’accent sur la lisibilité du code et la facilité d’utilisation. Depuis lors, Python a gagné en popularité et constitue un excellent choix pour le développement de scripts et d’applications rapides.

De nombreuses applications héritées sont encore écrites en Python 2. Les entreprises confrontées à une migration vers Python 3 doivent connaître les différences tant au niveau de la syntaxe que du comportement. L’objectif de cet article est de présenter les différences entre Python 2 et Python 3. À l’aide d’exemples, vous verrez comment des fonctions ont syntaxiquement la même apparence dans une version mais se comportent de manière complètement différente dans une autre version.

Version de Python la plus utilisée

La version la plus récente de Python est la 3.7 est sortie en 2018. La prochaine version 3.8 est actuellement en cours de développement et sera publiée en 2024. Bien que Python 2.7 soit encore largement utilisé. L’adoption de Python 3 connaît une croissance rapide. En 2016, 71,9 % des projets utilisaient Python 2.7, mais en 2017, ce chiffre était tombé à 63,7 %.

Quelle version devrais-je utiliser ?

Selon vos besoins et ce que vous voulez faire, choisissez la version qui vous aidera le plus. Si vous pouvez faire exactement ce que vous voulez avec Python 3.x, alors tant mieux ! Il y a cependant quelques inconvénients tels que :

  • La prise en charge des bibliothèques est légèrement moins bonne
  • Certaines distributions Linux et Mac actuelles utilisent encore la 2.x par défaut

Tant que Python 3.x est installé sur les ordinateurs de vos utilisateurs (ce qui est le cas dans la plupart des cas, car la plupart des gens qui lisent ceci développent quelque chose pour eux-mêmes ou sur un environnement qu’ils contrôlent) et que vous écrivez des choses pour lesquelles vous savez qu’aucun des modules Python 2.x n’est nécessaire, c’est un excellent choix. De plus, la plupart des distributions Linux ont déjà installé Python 3.x et presque toutes sont disponibles pour les utilisateurs finaux. Une réserve peut être émise si Red Hat Enterprise Linux (jusqu’à la version 7) où Python 3 existe dans le dépôt EPEL, mais certains utilisateurs peuvent ne pas être autorisés à installer quoi que ce soit à partir d’emplacements complémentaires ou non sécurisés. De plus, certaines distributions abandonnent progressivement Python 2 comme ancienne installation par défaut.

Les instructeurs devraient présenter Python 3 aux nouveaux programmeurs, mais discuter des différences avec Python 2.

S’abstenir de commencer tout nouveau développement en Python 2 car à partir de janvier 2020, Python 2 sera EOL ( » End of Life « ), ce qui signifie que tout support officiel cessera.

Quelle est la différence entre Python 2 et 3?

La principale différence est que certaines choses devront être importées de différents endroits afin de gérer le fait qu’elles ont des noms différents dans Python 2 et Python 3. En conséquence, le paquet de compatibilité six est un utilitaire clé pour supporter Python 2 et Python 3 dans une seule base de code.

Nous discuterons des principales différences dans chaque section de cet article et fournirons des exemples de captures d’écran de console dans Python 2 et Python 3.

Librairies : Python 2 vs Python 3

Du point de vue des bibliothèques, les bibliothèques sont énormément différentes dans Python 2 vs Python 3. De nombreuses bibliothèques développées pour Python 2 ne sont pas compatibles dans Python 3. Les développeurs des bibliothèques utilisées dans Python 3 ont de bons standards et ont amélioré les bibliothèques de Machine Learning et de Deep Learning.

Division d’entiers dans Python 2 et 3

La division d’entiers est la division de deux nombres moins la partie fractionnaire. Dans Python 2, vous obtenez exactement ce pour quoi la division entière a été définie.

Exemple 1. Division entière en Python 2.

Dans la capture d’écran de la console ci-dessous, vous voyez la division de deux nombres entiers. Le résultat dans Python 2 est également un nombre entier. Il manque la partie fractionnaire.

Exemple 2. Division d’entiers en Python 3.

Dans la capture d’écran de la console ci-dessous, vous voyez la division de deux entiers en Python 3. Le résultat est un nombre à virgule flottante qui inclut la partie fractionnaire qui manque dans Python 2.

Si la partie fractionnaire est requise dans Python 2, vous pouvez spécifier l’un des entiers que vous divisez comme un nombre à virgule flottante. De cette façon, cela force le résultat à être un nombre à virgule flottante.

Syntaxes de l’instruction print Python 2 vs 3

En Python 2, print est une instruction qui prend un certain nombre d’arguments. Elle imprime les arguments avec un espace entre eux. En Python 3, print est une fonction qui prend également un certain nombre d’arguments.

Exemple 3. Instruction print en Python 2

Dans cet exemple, nous utilisons l’instruction print avec trois arguments. Remarquez que Python 2 imprime les trois arguments séparés par un espace. Ensuite, nous utilisons l’instruction print avec des parenthèses rondes entourant les trois arguments. Le résultat est un tuple de trois éléments.

Exemple 4. Fonction print dans Python 3.

Dans cet exemple, nous utilisons la fonction print avec trois arguments et nous obtenons le même résultat que dans l’exemple 3 avec Python 2. Cependant, lorsque nous voulons imprimer le tuple, nous devons entourer le tuple d’un autre ensemble de parenthèses arrondies.

Pour obtenir le même résultat en Python 2 qu’en Python 3, nous pouvons utiliser la directive future pour indiquer au compilateur d’utiliser une fonctionnalité disponible dans une version future.

Exemple 5. Directive future dans Python 2.

Support de l’Unicode dans Python 2 vs Python 3

Dans Python 2, lorsque vous ouvrez un fichier texte, la fonction open() renvoie une chaîne de texte ASCII. En Python 3, la même fonction open() renvoie une chaîne unicode. Les chaînes unicode sont plus polyvalentes que les chaînes ASCII. En ce qui concerne le stockage, vous devez ajouter un « u » si vous voulez stocker des chaînes ASCII en tant que chaînes Unicode dans Python 2.

Exemple 6. Les chaînes de caractères en Python 2

Exemple 7. Les chaînes de caractères en Python 3

En Python 2, il existe deux types d’objets différents qui peuvent être utilisés pour représenter une chaîne de caractères. Il s’agit de ‘str’ et ‘unicode’. Les instances de ‘str’ sont des représentations d’octets alors qu’avec unicode, ce sont des entiers de 16 ou 32 bits. Les chaînes Unicode peuvent être converties en chaînes d’octets avec la fonction encode().

Dans Python 3, il existe également deux types d’objets différents qui peuvent être utilisés pour représenter une chaîne. Il s’agit de ‘str’ et ‘bytes’. Le ‘str’ correspond au type ‘unicode’ dans Python 2. Vous pouvez déclarer une variable ‘str’ et y stocker une chaîne de caractères sans la faire précéder d’un ‘u’ car c’est le cas par défaut. Bytes » correspond au type « str » de Python 2. C’est un format de sérialisation binaire représenté par une séquence d’entiers de 8 bits qui est excellent pour l’envoyer sur Internet ou pour le stocker sur le système de fichiers.

Gestion des erreurs Python 2 vs Python 3

La gestion des erreurs en Python consiste à lever des exceptions et à fournir des gestionnaires d’exceptions. La différence entre Python 2 et Python 3 est principalement syntaxique. Examinons quelques exemples.

Exemple 8. Soulever des erreurs en Python 2.

Dans la capture d’écran de la console ci-dessous, nous essayons de lever une erreur dans les deux formats et cela fonctionne.

Exemple 9. Lever des erreurs dans Python 3.

Dans la capture d’écran de la console ci-dessous, lever une erreur ne fonctionne pas dans Python 3 comme c’était le cas dans Python 2.

Avec les gestionnaires d’exception, la syntaxe a légèrement changé dans Python 3.

Exemple 10. Bloc try et exception en Python 2.

Dans la capture d’écran de la console ci-dessous, nous spécifions un bloc try avec un gestionnaire d’exception. Nous provoquons volontairement une erreur en spécifiant un nom indéfini dans le ‘try’.

Exemple 11. Bloc try et exception en Python 3.

Dans la capture d’écran de la console ci-dessous, nous spécifions le même code que l’exemple précédent en Python 2. Remarquez la nouvelle syntaxe de Python 3, qui nous oblige à utiliser le mot  » as « .

Comparaison de types non ordonnables

Dans Python 2, il était possible de comparer des types non ordonnables tels qu’une liste avec une chaîne de caractères.

Exemple 12. Comparaison d’une liste à une chaîne de caractères.

Exemple 13. Comparer une liste à une chaîne de caractères en Python 3.

Nouveau dans Python 3, une TypeError est levée si vous essayez de comparer une liste à une chaîne de caractères.

XRange en Python 2 vs Python 3

En Python 2, il existe la fonction range() et la fonction xrange(). La fonction range() renvoie une liste de nombres alors que la fonction xrange() renvoie un objet.

En Python 3, il n’y a que la fonction range() et pas de fonction xrange(). La raison pour laquelle il n’y a pas de fonction xrange() est que la fonction range() se comporte comme la fonction xrange() en Python 2. En d’autres termes, la fonction range() renvoie l’objet range.

Exemple 14. La fonction range() et XRange() en Python 2.

Dans la capture d’écran de la console ci-dessous, nous voyons que la fonction range() renvoie une liste contenant 5 éléments parce que nous avons passé ‘5’ comme argument. Lorsque nous utilisons xrange(), nous récupérons un objet à la place.

Exemple 15. La fonction Range() en Python 3.

Comme vous pouvez le voir sur la capture d’écran de la console ci-dessous, la saisie de la fonction range() avec ‘5’ comme argument entraîne le retour d’un objet. Cependant, lorsque nous essayons d’utiliser la fonction xrange(), nous voyons que Python 3 ne l’aime pas car elle est indéfinie.

Dans Python 2, il y avait un certain nombre de fonctions qui retournent des listes. Dans Python 3, un changement a été fait pour retourner des objets itérables au lieu de listes. Cela inclut les fonctions suivantes:

  • zip()
  • map()
  • filter()
  • Méthode .key() de Dictionary
  • Méthode .values() de Dictionary
  • Méthode .items() method

Module Futur dans Python 2 vs 3

Si vous prévoyez le support de Python 3 pour votre code Python 2, alors vous pourriez vouloir ajouter le module __future__. Par exemple, la division des entiers avait changé de Python 2 à 3 mais si vous voulez que votre code Python 2 se comporte comme Python 3, tout ce que vous avez à faire est d’ajouter cette ligne:

« from __future__ import division »

Maintenant dans votre code Python 2, la division de deux entiers résultera en un nombre à virgule flottante.

Exemple 16. Importation depuis le module __future__.

Comme vous pouvez le voir ci-dessous, lorsque nous divisons 2 / 3, nous obtenons 0 qui est de type entier. Mais après avoir importé la division depuis le module __future__, 2 / 3 a renvoyé le type nombre à virgule flottante.

Il y a d’autres choses que vous pouvez spécifier pour faciliter vos futures migrations. Elles incluent :

  • Générateurs
  • Division
  • Absolute_import
  • With_statement
  • Print_function
  • Unicode_literals

Cet article a été modifié pour la dernière fois le 6 juin 2020 9:20 am

.

Catégories : Articles

0 commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *