site sans réclame PythonCont@ctS'abonner

Python 3: les différences

P

YTHON 3 est maintenant fourni avec les dernières versions des distributions GNU/Linux (python3.1 sur Debian 6.0 Squeeze, 3.2 sur 7.0 Wheezy, 3.4 sur 8.0 Jessie, 3.5 sur 9.0 Stretch). L'application se lance avec python3.

Pour les versions antérieures, il faut récupérer un fichier Python...tar.bz2 dans la version désirée, le décompresser et compiler les sources. Il faut également que les sources ou les headers de votre noyau soient installés. Dans le répertoire décompressé intervient la séquence des commandes ./configure, make et suEn mode super-utilisateur: su [Enter] make install saisies dans une console.

Pour python 3 installé par vous-même, il faut préciser la version dans vos fichiers autoexécutables. En cas d'installation de la version 3.2:

#! /usr/bin/python3.2

Variables, fonctions et mots réservés

Les noms de variable et de fonction peuvent désormais contenir des lettres accentuées. Cette nouvelle utilisation n'est pas conseillée dans le cadre d'un projet international, car même si l'UTF8 permet un codage universel de ces caractères, tous les claviers n'ont pas les mêmes facilités à produire toutes les lettres accentuées. Pour vous en convaincre, tentez š, æ, å... avec un clavier azerty...

Les mots réservés à python, qui ne peuvent être utilisés comme nom de variable ou de fonction sont: and - as - assert - break - class - continue - def - del - elif - else - except - exec - finally - for - from - global - if - import - is - lambda - not - or - pass - raise - return - try - while - with - yield

Remarques: with et as avaient déjà été ajoutés à python 2.6

exec()

En python3, exec n'est plus un mot réservé, il est remplacé par la fonction interne exec():

>>> exec("from math import sin,pi; print(sin(pi/4))")
0.7071067811865475

print()

De la même manière, l'ancien mot réservé print est remplacé par la fonction print():

print("Eggs & spam") remplace print "Eggs & spam"

Il est déjà possible d'utiliser print() avec parenthèses en Python 2.6 grâce à from __future__ import print_function (sur la première ligne du script ne commençant pas par '#').

print("J'ai", 23, "ans", sep=" - ") permet de remplacer l'espace (séparateur par défaut) par une chaîne
print("Eggs", end=" ; ") remplace le saut de ligne par une chaîne. Attention: une suite de print(chaine,end="") ne sera affichée qu'à partir du premier print() contenant un saut de ligne. Ne convient pas pour afficher une barre de progression horizontale.

Note

En Python 3.0 et 3.1, print("%,d" %(1234)) permettait d'afficher la virgule séparatrice de milliers, et %b permettait la sortie d'un entier en binaire

raw_input() est supprimé

Python 2 faisait une différence entre input() et raw_input(). Le premier évaluait une saisie, calculant une opération ou exécutant une commande, le second envisageant l'entrée comme une simple chaîne. raw_input() est supprimé et est remplacé par input() pour la simple saisie de chaîne n'évaluant plus l'entrée. Pour évaluer une saisie, utiliser eval():

>>> a,b,c =eval(input("a,b,c: "))
a,b,c: 13,43,59
>>> a
13
>>> b
43
>>> c
59

reduce() doit être importé

En Python 3, la fonction reduce() doit être importée du module functools.

Nombres

Les entiers sont maintenant tous illimités. Le suffixe L et la fonction long() sont abandonnés.

La chaîne octale commence nécessairement par 0o (le chiffre 'zéro' et la lettre 'o', minuscule ou majuscule). 077 seulement préfixé du zéro n'est plus reconnu et engendre l'erreur invalid token.

Divisions

La division / n'est plus entière: 7/4 vaut 1.75 . La division entière est toujours représentée par //.

>>> 7//4
1
>>> -7//4
-2

!= est le seul opérateur de test d'inégalité: <>, déjà dépréciés en python 2, est purement et simplement supprimé.

round(n) limite l'affichage du nombre à la décimale demandée (jusqu'à python 2.6, il pouvait y subsister une imprécision: round(3.14159,2) donnait 3.1400000000000001).

>>> round(3.14159,2)
3.14

Chaînes

Par défaut, les chaînes sont en UTF-8, ce qui signifie que

# -*- coding: utf8 -*-

n'est plus nécessaire en tout début de script (n'oubliez pas de paramétrer la console en utf-8). Pour un autre codage, préciser (par exemple)

# -*- coding: latin-1 -*-

Il s'ensuit que pour ch="ôté", ch[2] vaut le caractère é. C'est extrêmement utile lors de décomposition de chaînes.

Collections

Python 3 connaît une nouvelle forme de dictionnaire: OrderedDict, qui conserve la mémoire de l'ordre de ses éléments.

Beaucoup de réponses de fonctions internes ou de méthodes renvoyaient une liste []. Elles sont maintenant en général remplacées par un itérateur chaque fois spécifique. Par exemple:

Cela signifie que le référencement par index [] et des méthodes telles que .pop() n'y sont plus applicables: il faut passer par la création d'une liste:

listecles=list(dico.keys())