|
@@ -104,7 +104,7 @@ def tire_carte((): |
|
|
return (valeur, couleur) |
|
|
return (valeur, couleur) |
|
|
|
|
|
|
|
|
(v, c) = tire_carte() |
|
|
(v, c) = tire_carte() |
|
|
print("{} de {}", v, c) |
|
|
|
|
|
|
|
|
print(v, "de", c) |
|
|
# 10 de trèfle |
|
|
# 10 de trèfle |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
@@ -195,9 +195,237 @@ x = get_max(ma_liste) |
|
|
* on peut aussi utiliser la fonction native "max()" |
|
|
* on peut aussi utiliser la fonction native "max()" |
|
|
* on peut aussi utiliser une slice: `autre_liste = liste[:]` |
|
|
* on peut aussi utiliser une slice: `autre_liste = liste[:]` |
|
|
|
|
|
|
|
|
# Conclusion |
|
|
|
|
|
|
|
|
|
|
|
Une fonction ne peut modifier la valeur de ses arguments qui s'ils sont |
|
|
|
|
|
|
|
|
# Valeur par défaut |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
def exemple_bizarre(l=[1, 2, 3]): |
|
|
|
|
|
l.append(4) |
|
|
|
|
|
return l |
|
|
|
|
|
|
|
|
|
|
|
>>> exemple_bizarre() |
|
|
|
|
|
[1, 2, 3, 4] |
|
|
|
|
|
>>> exemple_bizarre() |
|
|
|
|
|
[1, 2, 3, 4, 4] |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
* Les arguments par défaut ne sont évalué qu'une seule fois) |
|
|
|
|
|
|
|
|
|
|
|
# Valeur par défaut (2) |
|
|
|
|
|
|
|
|
|
|
|
Parfois, ce comportement *peut* être voulu |
|
|
|
|
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
def grosse_fonction(x, cache=dict()): |
|
|
|
|
|
if x in cache: |
|
|
|
|
|
return cache[x] |
|
|
|
|
|
else: |
|
|
|
|
|
resultat = ... # plein de calculs |
|
|
|
|
|
cache[x] = resultat |
|
|
|
|
|
return resultat |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Valeur par défaut (3) |
|
|
|
|
|
|
|
|
|
|
|
Sinon, remplacez l'argument mutable par un argument immutable |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
def exemple_bizarre(l=None): |
|
|
|
|
|
if not l: |
|
|
|
|
|
l = [1, 2, 3] |
|
|
|
|
|
l.append(4) |
|
|
|
|
|
return l |
|
|
|
|
|
|
|
|
|
|
|
>>> exemple_bizarre() |
|
|
|
|
|
[1, 2, 3, 4] |
|
|
|
|
|
>>> exemple_bizarre() |
|
|
|
|
|
[1, 2, 3, 4, 4] |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Conclusions |
|
|
|
|
|
|
|
|
|
|
|
* Une fonction ne peut modifier la valeur de ses arguments qui s'ils sont |
|
|
mutables. |
|
|
mutables. |
|
|
|
|
|
|
|
|
Toutes les copies doivent être explicites |
|
|
|
|
|
|
|
|
* Toutes les copies doivent être explicites |
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
|
|
|
|
\center Itérer sur les dictionnaires |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Itérer sur les clés |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
scores = { "alice": 3, "bob": 4 } |
|
|
|
|
|
for prénom in scores: |
|
|
|
|
|
score = scores[prénom] |
|
|
|
|
|
print(prénom, score) |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
Même chose avec la méthode `.keys()` |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
for prénom in scores.keys(): |
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Itérer sur les valeurs |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
scores = { "alice": 3, "bob": 4 } |
|
|
|
|
|
for score in scores.values(): |
|
|
|
|
|
print(score) |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Itérer sur les clés *et* les valeurs |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
for (prénom, score) in scores.items() |
|
|
|
|
|
print(prénom, score) |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
|
|
|
|
Notes: |
|
|
|
|
|
|
|
|
|
|
|
* on a gagné une ligne par rapport au premier exemple. |
|
|
|
|
|
* `items()` renvoie une liste de tuples |
|
|
|
|
|
|
|
|
|
|
|
# Presque des listes |
|
|
|
|
|
|
|
|
|
|
|
Les méthodes `.keys()`, `.values()` et `.items()` ne retournent pas des listes, |
|
|
|
|
|
mais des "vues". |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
>>> prénoms = scores.keys() |
|
|
|
|
|
>>> prénoms[1] |
|
|
|
|
|
TypeError: 'dict_keys' object does not support indexing |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
|
|
|
|
On détaillera cette question plus tard. |
|
|
|
|
|
|
|
|
|
|
|
# Forcer des listes |
|
|
|
|
|
|
|
|
|
|
|
En attendant, vous pouvez convertir les vues en listes: |
|
|
|
|
|
|
|
|
|
|
|
```python |
|
|
|
|
|
>>> prénoms = scores.keys() |
|
|
|
|
|
>>> premier_prénom = list(prénoms)[0] |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
|
|
|
|
\center \huge La programmation n'est pas un art solitaire |
|
|
|
|
|
|
|
|
|
|
|
# Le mythe |
|
|
|
|
|
|
|
|
|
|
|
> Un développeur dans son garage a une idée géniale, |
|
|
|
|
|
> l'implémente tout seul et gagne un tas de pognon. |
|
|
|
|
|
|
|
|
|
|
|
\vfill |
|
|
|
|
|
|
|
|
|
|
|
Ça n'existe pas (ou plus) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* Sauf dans les fictions |
|
|
|
|
|
* Quasiment mon seul reproche à propos de la série *Silicon Valley* |
|
|
|
|
|
|
|
|
|
|
|
# La code review |
|
|
|
|
|
|
|
|
|
|
|
Ce qu'on a fait avec l'exercice de la dernière fois :) |
|
|
|
|
|
|
|
|
|
|
|
# Par mail - envoi |
|
|
|
|
|
|
|
|
|
|
|
```text |
|
|
|
|
|
Bonjour Alice, voici une nouvelle fonction: |
|
|
|
|
|
|
|
|
|
|
|
def ma_fonction(): |
|
|
|
|
|
ma_liste = ... |
|
|
|
|
|
|
|
|
|
|
|
if len(ma_liste) == 0: |
|
|
|
|
|
# la liste est vide |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
signé: Bob |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Par mail - réponse |
|
|
|
|
|
|
|
|
|
|
|
```text |
|
|
|
|
|
Bonjour Bob, et merci pour ta contribution! |
|
|
|
|
|
|
|
|
|
|
|
def ma_fonction(): |
|
|
|
|
|
ma_liste = ... |
|
|
|
|
|
|
|
|
|
|
|
if len(ma_liste) == 0: |
|
|
|
|
|
# la liste est vide |
|
|
|
|
|
>> Ici tu pourrais mettre `if not ma_liste` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
signé Alice |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Par mail - envoi 2 |
|
|
|
|
|
|
|
|
|
|
|
```text |
|
|
|
|
|
Bonjour Alice, voici une nouvelle version de mes changements |
|
|
|
|
|
|
|
|
|
|
|
def ma_fonction(): |
|
|
|
|
|
ma_liste = ... |
|
|
|
|
|
|
|
|
|
|
|
if not ma_liste: |
|
|
|
|
|
... |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
# Code review |
|
|
|
|
|
|
|
|
|
|
|
Croyez-le ou nom, plein de projets fonctionnent comme ça. |
|
|
|
|
|
|
|
|
|
|
|
Pas d'outil spécifiques, on peut tout faire avec des e-mail |
|
|
|
|
|
et du texte brut |
|
|
|
|
|
|
|
|
|
|
|
# D'autres outils |
|
|
|
|
|
|
|
|
|
|
|
Des outils essayent de "simplifier" le processus. En vrac: `gerrit`, `github`, `gitlab` ... |
|
|
|
|
|
|
|
|
|
|
|
Mais dans son essence le concept n'a pas changé |
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
|
|
|
|
\center \huge Un atelier |
|
|
|
|
|
|
|
|
|
|
|
# Mob programming |
|
|
|
|
|
|
|
|
|
|
|
Ou programmation en foule |
|
|
|
|
|
|
|
|
|
|
|
# Les règles |
|
|
|
|
|
|
|
|
|
|
|
* Un pilote: le seul autorisé à modifier le code |
|
|
|
|
|
* Un copilote: indique au pilote quoi faire |
|
|
|
|
|
* On tourne toutes les 15 minutes |
|
|
|
|
|
|
|
|
|
|
|
# Le challenge |
|
|
|
|
|
|
|
|
|
|
|
On va prendre deux discours politique et faire de l'analyse automatique de texte dessus. |
|
|
|
|
|
|
|
|
|
|
|
Notamment, repérer les mots qui reviennent le plus |
|
|
|
|
|
|
|
|
|
|
|
# Jean Véronis - aparté |
|
|
|
|
|
|
|
|
|
|
|
Un universitaire malheureusement décédé s'en était fait une spécialité. |
|
|
|
|
|
|
|
|
|
|
|
Vous pouvez lire *Les Mots du Président* si ça vous dit. |
|
|
|
|
|
|
|
|
|
|
|
Il utilisait d'autres outils, bien sûr, mais ce qu'on va faire n'est pas si loin |
|
|
|
|
|
|
|
|
|
|
|
# Squelette du code |
|
|
|
|
|
|
|
|
|
|
|
Parlons-en! |