Python 3: les différences

P

YTHON 3 est 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.3 sur 9.0 Stretch). L'application se lance avec python3.

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

execfile()

execfile() n'existe plus en python3.

file()

file() n'existe plus en python3, il faut utiliser open().

print()

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.

from functools import reduce
reduce()

ou

import functools
functools.reduce()

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é en python 2, est supprimé en python3.

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: utf-8 -*-

n'est plus nécessaire en début de script (n'oubliez pas de paramétrer la console en utf-8).

Le changement n'est pas anodin: les chaînes Il s'ensuit que pour ch="côté", ch[3] vaut le caractère é. C'est extrêmement utile lors de décomposition de chaînes.

#! /usr/bin/python3

chaine="côté"
print(len(chaine)) # la réponse est 4
print(chaine[3]) # la réponse est 'é'
#! /usr/bin/python

chaine="côté"
print(len(chaine)) # la réponse est 6: 'ô' et 'é' valent chacun deux octets
print(chaine[3]) # la réponse est 't'

Pour tout autre encodage que UTF-8, le préciser avec (par exemple)

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

La différence entre les encodages iso-8859-15 et utf-8 d'un même texte est assez minime, environ 5% de plus pour le second. Ce n'est pas le cas si vous utilisez des textes en arabe ou en grec (deux octets par lettre en utf-8 contre un octet en iso-8859-7 ou iso-8859-6) ou en idéogrammes (trois octets, contre deux dans les encodages spécifiques aux langues asiatiques).

decode() n'existe plus en python3.

Collections

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

En python2, beaucoup de réponses de fonctions internes ou de méthodes renvoyaient une liste []. Elles sont maintenant remplacées par des itérateurs spécifiques. Par exemple,

Cela signifie que le référencement par index xx[n] et des méthodes telles que .pop() n'y sont plus applicables ; il reste possible de itérer directement:

>>> for i in map(ord,'python'):
...  print(i)
...
112
121
116
104
111
110
Il est également permis d'en faire une liste:
listecles=list(Mon_Dico.keys())