Fonctions#

Fonctions simples#

En programmation, une fonction est un bloc de code (suite d'instructions) permettant de réaliser une tâche donnée et auquel nous donnons un nom. Cela permet de découper un programme en plusieurs petites tâches plus faciles à résoudre. Ainsi le code est plus lisible et plus facile à comprendre. Pour cela, il est essentiel de choisir un nom de fonction qui explique ce qu'elle fait.

Astuce

Une fonction doit toujours être définie avant d'être appelée, c'est pourquoi il est préférable de placer toutes les définitions de fonctions au début du programme (après les imports et les définitions de variables globales).

Exemple 4#

Fonction qui affiche un conseil météo:

1# définition des fonctions
2def conseil_meteo():
3  print("Mets tes lunettes de soleil et profite!")
4
5# programme principal
6print("=== Conseil météo ===")
7# appel de la fonction
8conseil_meteo()

Cette fonction affiche toujours le même conseil météo ce qui n'est pas très intéressant, le conseil devrait s'adapter au temps qu'il fait.

Fonctions avec paramètres#

Un paramètre d'une fonction est une variable définie dans la fonction qui recevra une valeur lors de chaque appel de la fonction. Ainsi le comportement d'une fonction varie suivant les valeurs de ses paramètres.

Exemple 5#

Fonction qui affiche un conseil météo en fonction de celle-ci

 1# définition des fonctions
 2def conseil_meteo(meteo):
 3  if meteo == "soleil":
 4    print("Mets tes lunettes de soleil et profite!")
 5  elif meteo == "pluie":
 6    print("Prends ton parapluie ou tu seras trempé(e)!")
 7  elif meteo == "neige":
 8    print("Enfile tes gants et va faire un bonhomme de neige!")
 9  else:
10    print("Hmm... je ne sais pas quoi te conseiller pour cette météo!")
11
12
13# programme principal
14print("=== Conseil météo ===")
15
16# demande la météo du jour à l'utilisateur
17meteo_du_jour = input("Quel temps fait-il aujourd'hui? (soleil/pluie/neige/autre): ")
18
19# appel de la fonction en fonction de la réponse de l'utilisateur
20conseil_meteo(meteo_du_jour)

Exercice 9#

Créez une fonction compteur()...

  1. qui compte de 0 à un nombre donné appelé stop:

    1def compteur(stop):
    2  # à compléter
    3
    4compteur(11)
    
  2. qui compte de start à stop avec start < stop:

    1def compteur(start, stop):
    2  # à compléter
    3
    4compteur(4, 11)
    
  3. qui compte de start à stop avec un pas donné step (de 2 en 2 ou de 3 en 3):

    1def compteur(start, stop, step):
    2  # à compléter
    3
    4compteur(4, 11, 3)
    

Exercice 10#

Définissez un fonction affiche_max qui prend 2 paramètres numériques. Cette fonction doit comparer les deux paramètres et afficher le maximum.

1# Complétez la fonction
2def affiche_max(a, b):
3  ...
4
5affiche_max(4, 12)
6affiche_max(14, 5)
7affiche_max(3, -7)
8affiche_max(2, 2)

Exercice 11#

Au-dessus du code donné, définissez une fonction nommée affiche_prix_billet prenant en paramètre l'âge de l'utilisateur et affichant le prix du billet de cinéma en fonction de cet âge.

Le prix du billet est de 10 CHF pour les moins de 12 ans, de 14 CHF pour les 65 ans et plus et de 16 CHF pour les autres. La fonction affiche uniquement le prix.

Le code donné doit ensuite pouvoir s'exécuter sans erreur et afficher exactement les prix des billets pour tous les âges de 1 à 70 ans.

1# Définissez la fonction affiche_prix_billet
2...
3
4for a in range(1, 71):
5  affiche_prix_billet(a)

Exercice 12#

Il est souvent difficile de débugger un code qui ne fonctionne pas. En s'aidant des messages d'erreurs affichés, corrigez le programme ci-dessous qui calcule l'aire et le périmètre d'un triangle isocèle et rectangle dont la base (hypoténuse) est connue.

Triangle isocèle rectangle
 1from math import sqrt
 2
 3def affiche_aire(base, hauteur)
 4  aire_triangle = base * hauteur
 5  print("L'aire vaut", aire_triangle)
 6
 7def affiche_perimetre(cote1, cote2, cote3):
 8  perimetre = cote1 + cote2 + cote3
 9  print("Le périmètre vaut" perimetre)
10
11base = 500
12cathete = base / 2
13cote = sqrt(cathete**2 + cathete**2)
14aire = affiche_aire(base, hauteur)
15perimetre = affiche_perimetre(base, cote, cote)

Exemple 6#

Nous avons défini une fonction discriminant qui calcule et affiche le discriminant d'une équation du 2 degré. L'équation est de la forme:

\[ax^2 + bx + c = 0\]
1# definition des fonctions
2def discriminant(a, b, c):
3  print(b ** 2 - 4 * a * c)
4
5# progamme principal
6discriminant(1, 2, 1)

Pour afficher le nombre de solution ou les solutions de cette équation, j'ai besoin du résultat du discriminant. Malheureusement la fonction print ne permet pas de récupérer cette valeur.

Fonctions avec valeur de retour#

La commande return permet de retourner le résultat d'une fonction et ainsi de pouvoir le réutiliser dans la suite du programme. Pour cela, il est nécessaire de sauvegarder la valeur retournée dans une variable.

Exemple 7#

 1# définition des fonctions
 2def discriminant(a, b, c):
 3  return(b ** 2 - 4 * a * c)
 4
 5# programme principal
 6
 7# afficher le nombre de solution
 8delta = discriminant(1, 2, 1)
 9if delta > 0:
10  print("L'équation a deux solutions.")
11elif delta == 0:
12  print("L'équation a une solution.")
13else:
14  print("L'équation n'a pas de solution.")

Améliorations possibles de l'exemple:

  1. Demandez les valeurs des coefficients a, b et c à l'utilisateur.

  2. Affichez les solutions quand elles existent.

Exercice 13#

Déterminez ce que font les programmes suivants et corrigez les erreurs.

  1. 1def convertit_min_sec(min):
    2  return min * 60
    3
    4convertit_min_sec(145)
    5print("145 minutes donnent", nb_secondes, "secondes.")
    
  2. 1def convertit_sec_min(sec):
    2  min = sec / 60
    3
    4nb_minutes = convertit_sec_min(38700)
    5print("38700 secondes donnent", nb_minutes, "minutes.")
    
  3. 1def calcule_double_moins_trois(x):
    2  x = 2 * x
    3  return x
    4  x = x - 3
    5
    6print(calcule_double_moins_trois(4))
    

Important

return interrompt la fonction. Tout ce qui se trouve dans la fonction, mais après le return sera ignoré.

1def double(x):
2  return 2*x
3  print("Ce texte ne s'affichera pas.")
4
5print(double(5))
6print("Fin du programme")

Exercice 14#

Sans l'exécuter, déterminez ce que va afficher le programme suivant. Ensuite, exécutez-le pour vérifier votre réponse.

 1def mystery_1(z):
 2  z *= 2
 3  return z
 4
 5def mystery_2(x):
 6  x -= 7
 7  if x < 0:
 8    return x
 9  else:
10    return x % 2
11
12y = 5
13print(mystery_1(y))
14print(mystery_2(y))
15print(mystery_2(2 * y))
16print(y // 2)

Exercice 15#

Complétez le programme ci-dessous. Nous avons défini une fonction majeur pour tester si une personne est majeure ou pas.

 1def majeur(age):
 2  if ... :
 3    return True
 4  else:
 5    return False
 6
 7# Demandez son âge à l'utilisateur
 8age = ...
 9
10if majeur(age):
11  print("Tu as le droit de vote")
12else:
13  print("Tu pourras voter dans", ..., "ans.")

Les fonctions sur les chaînes de caractères#

En Python, il existe beaucoup de fonctions prédéfinies qui permettent de manipuler les chaînes de caractères. La plupart sont des fonctions avec valeurs de retour.

txt: représente le texte analysé.
s: représente un caractère ou une chaine de caractères

len(txt)

retourne le nombre de caractères du texte (espaces compris)

txt.count(s)

retourne le nombre de fois que s apparaît dans txt.

txt.find(s)

retourne l'index de l'emplacement de la première apparition de s dans txt.
Si s n'apparaît pas dans txt la fonction retourne -1.

txt.replace(s, t)

retourne une nouvelle chaîne de caractères dans laquelle tous les s de txt ont été remplacé par t.

txt.lower()

retourne une nouvelle chaîne de caractères écrite en minuscules.

txt.upper()

retourne une nouvelle chaîne de caractères écrite en majuscules.

Exercice 16#

Sans les exécuter, que vont afficher ces programmes?
Exécutez-les ensuite pour vérifier votre réponse.

  1. 1txt = "J'aime les pommes, les pommes sont mon fruit favori!"
    2n = len(txt)
    3print(n)
    
  2. 1txt = "J'aime les pommes, les pommes sont mon fruit favori!"
    2n = txt.count("pommes")
    3print(n)
    
  3. 1txt = "J'aime les pommes, les pommes sont mon fruit favori!"
    2n = txt.find("pommes")
    3m = txt.find("poires")
    4print(n)
    5print(m)
    
  4. 1txt = "J'aime les pommes, les pommes sont mon fruit favori!"
    2new_txt = txt.replace("pommes", "poires")
    3print(new_txt)
    4print(txt)
    
  5. 1txt = "J'aime les POMMES!"
    2minu = txt.lower()
    3maju = txt.upper()
    4print(minu)
    5print(maju)
    6print(txt)
    

Exercice 17#

Un texte, généré par Gemini, a été sauvegardé dans la variable texte.

  1. Affichez le texte.

  2. Calculez et affichez le nombre de caractères de ce texte.

  3. Calculez et affichez la fréquence de la lettre "e", de la lettre "a", de la lettre "d" et de la lettre "x".
    Les valeurs correspondent-elles à celles attendues (voir Tables de fréquences)? Pourquoi?

  4. Définissez une fonction qui teste si le texte contient une certaine lettre et affiche:

    • "Oui, ce texte contient la lettre ..."

    • "Non, ce texte ne contient pas la lettre ..."

    La fonction prend deux paramètres: la lettre à tester et le texte.
    Testez la fonction avec les lettres "y" et "z".

1

Exercice 18#

Définissez une fonction qui modifie une phrase en son équivalent en leet speak. La fonction prend le texte à modifier en paramètre et retourne la phrase modifiée.

Testez avec d'autres phrases.

1phrase = "Mon devoir est corrompu par un virus :-/"

Exercice 19#

Python peut être utilisé pour chiffrer ou déchiffrer un message utilisant le chiffre de César, notamment en utilisant les deux fonctions ci-dessous.

ord(c)

retourne la valeur Unicode du caractère c passé en paramètre

chr(u)

retourne le caractère qui correspond à la valeur Unicode u passée en paramètre

Les textes à chiffrer et déchiffrer ne contiendront que des lettres majuscules ou minuscules. Les caractères spéciaux ne seront pas chiffrés (ni déchiffrés), il seront simplement retranscrit.

Exemple: La crypto est sympa! \(\implies\)OD FUBSWR HVW VBPSD!

Voici les principales étapes:

  1. Écrivez le message en majuscules.

  2. Créez une variable code pour le message codé.

  3. Parcourez le message un caractère après l'autre en utilisant une boule for:

    for c in text:
      ...
    
  4. Si le caractère est une lettre:

    • Récupérez l'index du caractère et lui appliquez le décalage de 3 lettres.

    • Ajoutez le nouveau caractère au code.

  5. Sinon, copiez le caractère dans le code.

  6. Affichez le message codé.

  7. Modifiez le code pour définir une fonction chiffre(message) qui chiffre un message au moyen du Chiffre de César. Cette fonction retourne le message codé.

  8. Définissez une fonction dechiffre(code) qui déchiffre un message codé au moyen du Chiffre de César. Cette fonction retourne le message décodé.

  9. Modifiez les deux fonctions chiffre et dechiffre pour pouvoir chiffrer et déchiffrer des messages avec un décalage quelconque.

1message = "Codez ce message!"