Licence CC BY-NC-ND, Thierry Parmentelat & Arnaud Legout
from IPython.display import HTML
HTML(filename="_static/style.html")
opérateurs#
un survol des opérateurs pour construire les expressions
précédence des opérateurs
comme pour tous les langages, les opérateurs ont une précédence; dans le doute: mettez des parenthèses !
rappels#
appel de fonction avec
()comme dansfoo(0)indexation avec
[]comme dansL[0]attribut avec
.comme dansS.upper()
arithmétiques#
arithmétiques:
+|-|*|/pas que sur les nombres
'on peut juste juxtaposer' ' deux chaines'
'on peut juste juxtaposer deux chaines'
'ou les' + ' additioner'
'ou les additioner'
['et', 'les'] + ['listes', 'aussi']
['et', 'les', 'listes', 'aussi']
4 * '-00-'
'-00--00--00--00-'
4 * [1, 2]
[1, 2, 1, 2, 1, 2, 1, 2]
dépendants du type#
digression: tous les opérateurs du langage sont dépendants du type des opérandes
10 + 20
30
"10" + "20"
'1020'
et comme on le verra, chaque type (y compris les classes qui sont des types définis par l’utilisateur) peut redéfinir le comportement des opérateurs
par exemple
une classe
Vectordonnera du sens àv1 + v2une classe
Pathdonnera du sens àpath / file
quotient et reste // et %#
rappel division entière: quotient et reste:
//et%
# avec des entiers
19 // 3
6
19 % 3
1
puissance **#
\(x^y\) :
x ** y
2 ** 100
1267650600228229401496703205376
opérateurs logiques#
opérateurs logiques:
and-or-notopérateurs d’appartenance:
inetnot in
comparaison#
comparaison:
==etis- déjà mentionnésnégation:
!=etis notrespectivementcomparaisons dans espaces ordonnés:
>=,>,<=,<curiosité: on peut les chainer
def est_moyenne(note):
return 10 <= note <= 12
est_moyenne(11)
True
évaluation paresseuse (avancé)#
andetorsont opérateurs short-circuiton évalue les opérandes de gauche à droite
et on s’arrête dès que le résultat est connu
A
andBSi A est
False,
B ne sera pas évalué
A
orBSi A est
True,
B ne sera pas évalué
# une fonction avec side-effect
counter = 0
def greater(a, b):
global counter
counter += 1
return a >= b
# ceci n'imprime rien
note = 11.5
if (greater(note, 10) and greater(note, 12)
and greater(note, 14) and greater(note, 16)):
print("excellent")
# ce qui intéressant, c'est
# combien de fois on a appelé greater
counter
2
opérateurs bitwise#
opérateurs dits bitwise:
&-|: et et ou logique, respectivement^: xor~: not
on les a aussi déjà rencontrés avec les ensembles
````{admonition} important pour pandas
:class: attention
ça semble anecdotique, mais ces opérateurs sont super utilisés notamment en pandas !
a = 0b111100
b = 0b110011
bin(a | b)
'0b111111'
bin(a & b)
'0b110000'
POO : opérateurs redéfinis#
tous ces opérateurs peuvent être redéfinis
c’est le propos des ‘méthodes magiques’
que l’on verra à propos des classes
exemple intéressant, la classe
Path
ex: / sur la classe Path#
# la classe Path nous a montré
# un bel exemple d'opérateur redéfini
from pathlib import Path
home = Path.home()
# l'opérateur / est défini sur Path
# et bien sûr ici CE N'EST PAS une division !
subdir = home / "git"
if subdir.exists():
print(f"le répertoire {subdir} existe")