un survol des opérateurs pour construire les expressions
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 + 2030"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 // 3619 % 31puissance **¶
:
x ** y
2 ** 1001267650600228229401496703205376opé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 <= 12est_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
counter2opé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 !
```{code-cell} ipython3
:tags: [gridwidth-1-2]
a = 0b111100
b = 0b110011
```
```{code-cell} ipython3
:tags: [gridwidth-1-2]
bin(a | b)
```
```{code-cell} ipython3
:tags: [gridwidth-1-2]
bin(a & b)
```
## 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`
+++ {"slideshow": {"slide_type": "slide"}}
### ex: `/` sur la classe `Path`
```{code-cell} ipython3
# la classe Path nous a montré
# un bel exemple d'opérateur redéfini
from pathlib import Path
```
```{code-cell} ipython3
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")
```