|
|
@@ -321,3 +321,218 @@ Plus de précisions dans la documentation: |
|
|
|
|
|
|
|
|
|
|
|
\url{https://docs.python.org/fr/3/library/string.html#format-specification-mini-language}. |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
\center |
|
|
|
None |
|
|
|
|
|
|
|
# Exprimer l'absence |
|
|
|
|
|
|
|
```python |
|
|
|
>>> scores = { "Anne": 42, "Bernard": 5 } |
|
|
|
>>> score1 = scores.get("Anne") |
|
|
|
>>> score1 |
|
|
|
42 |
|
|
|
>>> score2 = scores.get("Sophie") |
|
|
|
>>> score2 |
|
|
|
<rien> |
|
|
|
``` |
|
|
|
|
|
|
|
En réalité, `score2` a bien une valeur: `None`. |
|
|
|
|
|
|
|
L'interpréteur n'affiche rien quand la valeur est `None` |
|
|
|
|
|
|
|
|
|
|
|
# None est falsy |
|
|
|
|
|
|
|
```python |
|
|
|
element = dictionnaire.get(clé) |
|
|
|
if element: |
|
|
|
... |
|
|
|
``` |
|
|
|
|
|
|
|
Mais ici, comment faire la différence entre: |
|
|
|
|
|
|
|
* la clé existe et vaut 0, une chaîne vide, ou quoique ce soit de falsy |
|
|
|
* la clé existe et vaut None |
|
|
|
* la clé n'existe pas |
|
|
|
|
|
|
|
# Tester l'appartenance |
|
|
|
|
|
|
|
Avec `in`: |
|
|
|
|
|
|
|
```python |
|
|
|
if clé in dictionnaire: |
|
|
|
# La clé existe, pas d'erreur |
|
|
|
valeur = dictionnaire[clé] |
|
|
|
``` |
|
|
|
|
|
|
|
# Tester None |
|
|
|
|
|
|
|
Avec `is`: |
|
|
|
|
|
|
|
```python |
|
|
|
>>> scores = { "Anne": 42, "Bernard": 5 } |
|
|
|
>>> score1 = scores.get("Anne") |
|
|
|
>>> score1 is None |
|
|
|
False |
|
|
|
>>> score2 = scores.get("Sophie") |
|
|
|
>>> score2 is None |
|
|
|
True |
|
|
|
``` |
|
|
|
|
|
|
|
# Lever l'ambiguïté |
|
|
|
|
|
|
|
Notez qu'ici Sophie peut être dans le dictionnaire, mais avec une valeur 'None', |
|
|
|
ou bien ne pas y être. |
|
|
|
|
|
|
|
Attention aux ambiguïtés, donc! |
|
|
|
|
|
|
|
Pas de méthode magique : il faut être au courant du problème. |
|
|
|
|
|
|
|
|
|
|
|
# Retourner None |
|
|
|
|
|
|
|
`None` est aussi la valeur par défaut lorsqu'il n'y a pas de `return` |
|
|
|
dans le corps de la fonction: |
|
|
|
|
|
|
|
```python |
|
|
|
>>> def ne_retourne_rien(a, b): |
|
|
|
>>> c = a + b |
|
|
|
|
|
|
|
>>> résultat = ne_retourne_rien(3, 2) |
|
|
|
>>> résultat is None |
|
|
|
True |
|
|
|
``` |
|
|
|
|
|
|
|
# Retourner None au autre chose |
|
|
|
|
|
|
|
```python |
|
|
|
def trouve_dans_liste1(liste, element): |
|
|
|
if element in list: |
|
|
|
return liste.index(element) |
|
|
|
|
|
|
|
|
|
|
|
def trouve_dans_liste2(liste, element): |
|
|
|
if element in list: |
|
|
|
return liste.index(element) |
|
|
|
else: |
|
|
|
return None |
|
|
|
``` |
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
Les deux fonctions font la même chose! `trouve_dans_liste2` est simplement plus *explicite.* |
|
|
|
|
|
|
|
# Types optionnels |
|
|
|
|
|
|
|
```python |
|
|
|
def trouve_dans_liste(liste, element): |
|
|
|
if element in list: |
|
|
|
return liste.index(element) |
|
|
|
else: |
|
|
|
return None |
|
|
|
``` |
|
|
|
On dit aussi que le type de retour de `trouve_dans_liste` est *optionnel*. |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
\center Les tuples |
|
|
|
|
|
|
|
# Création de tuples |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
mon_tuple = tuple() # un tuple vide |
|
|
|
mon_tuple = () # aussi un tuple vide |
|
|
|
mon_tuple = (1, 2) # un tuple à deux éléments |
|
|
|
``` |
|
|
|
|
|
|
|
# Note |
|
|
|
|
|
|
|
C'est la virgule qui fait le tuple, pas les parenthèses |
|
|
|
(on n'utilise les parenthèse que pour l'esthétique) |
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
```python |
|
|
|
(1) |
|
|
|
# pas un tuple, juste le nombre 1 (entre parenthèses) |
|
|
|
(1,) |
|
|
|
# un tuple à un élément |
|
|
|
1, |
|
|
|
# le *même* tuple |
|
|
|
``` |
|
|
|
|
|
|
|
# Indexation, test d'appartenance |
|
|
|
|
|
|
|
```python |
|
|
|
>>> couple = ('Starsky', 'Hutch') |
|
|
|
>>> couple[0] |
|
|
|
'Starsky' |
|
|
|
>>> couple[1] |
|
|
|
'Hutch' |
|
|
|
>>> couple[3] |
|
|
|
IndexError |
|
|
|
|
|
|
|
|
|
|
|
>>> 'Starsky' in couple |
|
|
|
True |
|
|
|
>>> 'Batman' in couple |
|
|
|
False |
|
|
|
``` |
|
|
|
|
|
|
|
Rien de nouveau en principe :p |
|
|
|
|
|
|
|
# Déstructuration |
|
|
|
|
|
|
|
Créer plusieurs variables en une seule ligne |
|
|
|
|
|
|
|
```python |
|
|
|
>>> couple = ("Batman", "Robin") |
|
|
|
>>> héro, side_kick = couple |
|
|
|
>>> héro |
|
|
|
'Batman' |
|
|
|
>>> side_kick |
|
|
|
'Robin' |
|
|
|
|
|
|
|
>>> héro, side_kick, ennemi = couple |
|
|
|
ValueError 3 != 2 |
|
|
|
>>> héro, = couple |
|
|
|
ValueError 1 != 2 |
|
|
|
ValueError |
|
|
|
|
|
|
|
>>> héro = couple |
|
|
|
# OK, mais la variable héro est maintenant un tuple ... |
|
|
|
``` |
|
|
|
|
|
|
|
# On peut aussi déstructurer des listes |
|
|
|
|
|
|
|
```python |
|
|
|
>>> fruits = ["pomme", "banane", "orange"] |
|
|
|
>>> premier, deuxième, troisième = fruits |
|
|
|
``` |
|
|
|
|
|
|
|
# Retours multiple |
|
|
|
|
|
|
|
Retourner plusieurs valeurs: |
|
|
|
|
|
|
|
#TODO: better Exemple, pleaz |
|
|
|
|
|
|
|
```python |
|
|
|
def age_sexe_ville(pseudo): |
|
|
|
age = ... |
|
|
|
sexe = .. |
|
|
|
ville = ... |
|
|
|
return (age, sexe, ville) |
|
|
|
|
|
|
|
(a, s, v) = age_sexe_ville('kevin') |
|
|
|
# on dit aussi: unpacking |
|
|
|
``` |
|
|
|
|
|
|
|
``` |
|
|
|
a -> 14 |
|
|
|
s -> M |
|
|
|
v -> Paris |
|
|
|
``` |