Skip to article frontmatterSkip to article content

un survol des opérateurs pour construire les expressions

rappels

arithmétiques

'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

quotient et reste // et %

# avec des entiers
19 // 3
6
19 % 3
1

puissance **

2 ** 100
1267650600228229401496703205376

opérateurs logiques

comparaison

def est_moyenne(note):
    return 10 <= note <= 12
est_moyenne(11)
True

évaluation paresseuse (avancé)

# 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

````{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")
```