Voici maintenant un exemple de fonction en Python (crée le fichier `02-fonctions.py`) :

```python
# Renvoie la date passée en paramètre, augmentée d'un mois
def meme_jour_mois_prochain(date):

	# Découpe la chaîne et renvoie une liste
	# (équivalent des tableaux en Java, JS...)
	jour_mois_annee = date.split('/')

	# 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 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])

		if mois == 12:
			annee += 1
			mois = 1
		else:
			mois += 1

		return "{:02d}/{:02d}/{:04d}".format(jour, mois, annee)

	except ValueError:
		raise ValueError("La date attendue est au format JJ/MM/AAAA\n")

# 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`.

> 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é

> 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`.
