Particularité de Python

Pour les nouveaux utilisateurs de Python, une tentation sera de l’utiliser comme si c’était Matlab ou un autre langage. En fait, Python tire sa force des objets. Les objets sont des entités qui regroupent variables et fonctions et qui nous permettent flexibilité ainsi que facilité d’utilisation.

Quand on arrive d’ailleurs

Comme dans tout language de programmation, Python a des variables qui ont un type particulier. Ceci affecte ce qu’on peut faire avec ces variables.

[1]:
x = 2
type(2)
[1]:
int
[2]:
y = 2.0
type(y)
[2]:
float
[3]:
z = 'pomme'
type(z)
[3]:
str

Par exemple, l’addition de string donne :

[4]:
y = 'pomme'
z = 'sucrée'
y + ' ' + z
[4]:
'pomme sucrée'

alors que

[5]:
x = 3.0
y = 2.0
x + y
[5]:
5.0

Jusque ici tout est similaire à d’autres langages.

Les objets

Maintenant, la grande particularité de Python est de tout organiser autour des objets. Par exemple, supposons un vecteur composé de nombres entiers

[6]:
x = [3,2,1]
x
[6]:
[3, 2, 1]

Comme dans d’autres langages, on peut aller chercher un élément de la façon suivante:

[7]:
x[0]
[7]:
3

Ce qu’on appelerait un vecteur ailleurs est en fait un objet de type liste en Python.

[8]:
type(x)
[8]:
list

Les listes peuvent contenir n’importe quoi, pas nécessairement du même type…

[9]:
q = ['trousseau',4,2.0]
q
[9]:
['trousseau', 4, 2.0]

Mais comment comprendre ce qu’on peut faire avec une liste? Utilisons la fonction dir() pour voir ce que notre liste contient

[10]:
dir(x)
[10]:
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

Beaucoup de choses… Regardons sort pour voir ce que c’est en l’invoquant avec un point.

[11]:
x.sort
[11]:
<function list.sort(*, key=None, reverse=False)>

Il s’agit d’une fonction… La signature de la fonction nous dit qu’elle prend comme arguments key (un index pour faire le sort) et si on veut une liste ascendante ou descendante (reverse = True ou False). Les arguments key et reverse ont des valeurs par défaut, None (aucune clé) et reverse = False (tri ascendant). Appelons maintenant cette fonction en y ajoutant les parenthèses et donc en invoquant la fonction avec les arguments par défaut

[12]:
x.sort()
x
[12]:
[1, 2, 3]

Donc cette liste a des fonctions! On peut par exemple enlever les valeurs de 3 dans la liste

[13]:
x.remove

[13]:
<function list.remove(value, /)>
[14]:
x.remove(3)
[15]:
x
[15]:
[1, 2]

Les fonctions d’un objet sont ses méthodes.

Épilogue

Si nous retournons vers les variables que nous avons défini au départ, int, str et float. En fait, ce sont aussi des objets en Python, avec des méthodes particulières. Par exemple,

[16]:
x = 'je ne comprends rien'
dir(x)
[16]:
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmod__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'capitalize',
 'casefold',
 'center',
 'count',
 'encode',
 'endswith',
 'expandtabs',
 'find',
 'format',
 'format_map',
 'index',
 'isalnum',
 'isalpha',
 'isascii',
 'isdecimal',
 'isdigit',
 'isidentifier',
 'islower',
 'isnumeric',
 'isprintable',
 'isspace',
 'istitle',
 'isupper',
 'join',
 'ljust',
 'lower',
 'lstrip',
 'maketrans',
 'partition',
 'replace',
 'rfind',
 'rindex',
 'rjust',
 'rpartition',
 'rsplit',
 'rstrip',
 'split',
 'splitlines',
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']
[17]:
x = x.replace(' ne','')
x = x.replace(' rien','')
x
[17]:
'je comprends'
[18]:
x += ' tout'
x
[18]:
'je comprends tout'
[19]:
x = x.upper()
x
[19]:
'JE COMPRENDS TOUT'

La force de Python sera de structurer toutes les fonctions, etc, autour d’objets. Comme nous le verrons ceci génèrera des expressions simples et une flexibilité accrue.