|
@@ -1,36 +1,47 @@
|
|
|
Voici maintenant un exemple de fonction en Python (crée le fichier `02-fonctions.py`) :
|
|
Voici maintenant un exemple de fonction en Python (crée le fichier `02-fonctions.py`) :
|
|
|
|
|
|
|
|
```python
|
|
```python
|
|
|
-# Salue quelqu'un en utilisant son titre
|
|
|
|
|
-def greet_person(name, gender=''):
|
|
|
|
|
- if gender == 'male':
|
|
|
|
|
- title = 'Mr'
|
|
|
|
|
- elif gender == 'female':
|
|
|
|
|
- title = 'Ms'
|
|
|
|
|
- else:
|
|
|
|
|
- title = 'Mx' # titre "neutre"
|
|
|
|
|
- print("Hello %s %s" % (title, name))
|
|
|
|
|
-
|
|
|
|
|
-greet_person("Johnson", "male")
|
|
|
|
|
-greet_person("May", "female")
|
|
|
|
|
-```
|
|
|
|
|
|
|
+# Renvoie la date passée en paramètre, augmentée d'un mois
|
|
|
|
|
+def meme_jour_mois_prochain(date):
|
|
|
|
|
|
|
|
-Pour saluer (*greet*) une personne, on utilise le "titre honorifique" suivi du nom. Le titre est déterminé à partir du genre.
|
|
|
|
|
|
|
+ # Découpe la chaîne et renvoie une liste
|
|
|
|
|
+ # (équivalent des tableaux en Java, JS...)
|
|
|
|
|
+ jour_mois_annee = date.split('/')
|
|
|
|
|
|
|
|
-Remarques :
|
|
|
|
|
|
|
+ # On devrait avoir 3 éléments exactement
|
|
|
|
|
+ if len(jour_mois_annee) != 3:
|
|
|
|
|
+ raise ValueError("La date attendue est au format JJ/MM/AAAA\n")
|
|
|
|
|
|
|
|
-> On définit une fonction en précédant son nom du mot-clé `def`.
|
|
|
|
|
|
|
+ # On tente de convertir les éléments en entiers
|
|
|
|
|
+ try:
|
|
|
|
|
+ jour = int(jour_mois_annee[0])
|
|
|
|
|
+ mois = int(jour_mois_annee[1])
|
|
|
|
|
+ annee = int(jour_mois_annee[2])
|
|
|
|
|
|
|
|
-> Python **n'utilise pas** la syntaxe `{}`, commune à C/C++, Java, PHP, JavaScript, etc. pour ouvrir et fermer le corps d'une fonction (ou un bloc de code en général)
|
|
|
|
|
|
|
+ if mois == 12:
|
|
|
|
|
+ annee += 1
|
|
|
|
|
+ mois = 1
|
|
|
|
|
+ else:
|
|
|
|
|
+ mois += 1
|
|
|
|
|
|
|
|
-> Au lieu de cela, on ouvre un bloc de code en utilisant `:` et en laissant **au moins un espace d'indentation** au début de chaque ligne du bloc. Toutes les lignes d'un *même bloc* doivent avoir le même *niveau* d'indentation (même nombre d'espaces avant)
|
|
|
|
|
|
|
+ return "{:02d}/{:02d}/{:04d}".format(jour, mois, annee)
|
|
|
|
|
|
|
|
-Cette dernière particularité de Python est absolument fondamentale ! Python se base sur l'*indentation* pour détecter ce qui appartient à un même bloc.
|
|
|
|
|
|
|
+ except ValueError:
|
|
|
|
|
+ raise ValueError("La date attendue est au format JJ/MM/AAAA\n")
|
|
|
|
|
|
|
|
-> Essaie de voir ce qui se passe en "désindentant" la ligne `title = 'Mr'` pour la ramener au niveau du `if` qui la précède. **Tu risques de rencontrer cette erreur à nouveau si tu n'es pas rigoureux sur l'indentation**.
|
|
|
|
|
|
|
+# Verifie que ça marche
|
|
|
|
|
+print(meme_jour_mois_prochain("12/02/2018"))
|
|
|
|
|
+print(meme_jour_mois_prochain("27/12/2018"))
|
|
|
|
|
+print(meme_jour_mois_prochain("27/toto/2018"))
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Remarques :
|
|
|
|
|
+
|
|
|
|
|
+> On définit une fonction en précédant son nom du mot-clé `def`.
|
|
|
|
|
|
|
|
-Un avantage d'abandonner les `{}` est que le code est moins "chargé" visuellement. Il n'y a pas d'*obligation* quant au nombre d'espaces d'indentation, ni par rapport à d'autres aspects comme le nommage des variables et des fonctions. Ceci dit, la communauté Python utilise des *conventions* très largement adoptées, qui évitent que chacun(e) adopte sa propre convention. Par exemple :
|
|
|
|
|
-* on préconise l'usage de 4 espaces entre chaque niveau d'indentation (vrais espaces et non tabulation).
|
|
|
|
|
-* les fonctions et variables utilisent la convention [Snake case](https://fr.wikipedia.org/wiki/Snake_case) c'est à dire des `mots_minuscules_separes_par_underscore`.
|
|
|
|
|
|
|
+> Le corps de la fonction est, comme les blocs `while`, `try`, `catch` de l'exemple précédent, déterminé par les `:` ouvrants suivis d'un bloc indenté
|
|
|
|
|
|
|
|
-Dernière chose, les arguments de `print()` : La partie entre guillemets ressemble à ce qu'on pourrait trouver en C ou en Java : `%s` et `%d` sont des "emplacements" pour des variables (chaîne et entier respectivement). Par contre, la syntaxe de la suite diffère : les valeurs à insérer dans les emplacements sont situées entre parenthèses, suite au caractère `%`.
|
|
|
|
|
|
|
+> Un avantage d'abandonner les `{}` est que le code est moins "chargé" visuellement. Il n'y a pas *d'obligation* quant au nombre d'espaces d'indentation, ni par rapport à d'autres aspects comme le nommage des variables et des fonctions. Ceci dit, la communauté Python utilise des *conventions* très largement adoptées, qui évitent que chacun(e) adopte sa propre convention. Par exemple :
|
|
|
|
|
+- on préconise l'usage de 4 espaces entre chaque niveau d'indentation (vrais espaces et non tabulation).
|
|
|
|
|
+- les noms des fonctions et variables utilisent la convention [Snake case](https://fr.wikipedia.org/wiki/Snake_case) c'est à dire des `mots_minuscules_separes_par_underscore`.
|