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:

# définition des fonctions
def conseil_meteo():
  print("Mets tes lunettes de soleil et profite!")

# programme principal
print("=== Conseil météo ===")
# appel de la fonction
conseil_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

# définition des fonctions
def conseil_meteo(meteo):
  if meteo == "soleil":
    print("Mets tes lunettes de soleil et profite!")
  elif meteo == "pluie":
    print("Prends ton parapluie ou tu seras trempé(e)!")
  elif meteo == "neige":
    print("Enfile tes gants et va faire un bonhomme de neige!")
  else:
    print("Hmm... je ne sais pas quoi te conseiller pour cette météo!")


# programme principal
print("=== Conseil météo ===")

# demande la météo du jour à l'utilisateur
meteo_du_jour = input("Quel temps fait-il aujourd'hui? (soleil/pluie/neige/autre): ")

# appel de la fonction en fonction de la réponse de l'utilisateur
conseil_meteo(meteo_du_jour)

Exercice 7#

Créez une fonction compteur()...

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

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

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

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

Exercice 8#

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.

# Complétez la fonction
def affiche_max(a, b):
  ...

affiche_max(4, 12)
affiche_max(14, 5)
affiche_max(3, -7)
affiche_max(2, 2)

Exercice 9#

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.

# Définissez la fonction affiche_prix_billet
...

for a in range(1, 71):
  affiche_prix_billet(a)

Exercice 10#

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
from math import sqrt

def affiche_aire(base, hauteur)
  aire_triangle = base * hauteur
  print("L'aire vaut", aire_triangle)

def affiche_perimetre(cote1, cote2, cote3):
  perimetre = cote1 + cote2 + cote3
  print("Le périmètre vaut" perimetre)

base = 500
cathete = base / 2
cote = sqrt(cathete**2 + cathete**2)
aire = affiche_aire(base, hauteur)
perimetre = 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\]
# definition des fonctions
def discriminant(a, b, c):
  print(b ** 2 - 4 * a * c)

# progamme principal
discriminant(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#

# définition des fonctions
def discriminant(a, b, c):
  return(b ** 2 - 4 * a * c)

# programme principal

# afficher le nombre de solution
delta = discriminant(1, 2, 1)
if delta > 0:
  print("L'équation a deux solutions.")
elif delta == 0:
  print("L'équation a une solution.")
else:
  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 11#

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

  1. def convertit_min_sec(min):
      return min * 60
    
    convertit_min_sec(145)
    print("145 minutes donnent", nb_secondes, "secondes.")
    
  2. def convertit_sec_min(sec):
      min = sec / 60
    
    nb_minutes = convertit_sec_min(38700)
    print("38700 secondes donnent", nb_minutes, "minutes.")
    
  3. def calcule_double_moins_trois(x):
      x = 2 * x
      return x
      x = x - 3
    
    print(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 12#

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

def mystery_1(z):
  z *= 2
  return z

def mystery_2(x):
  x -= 7
  if x < 0:
    return x
  else:
    return x % 2

y = 5
print(mystery_1(y))
print(mystery_2(y))
print(mystery_2(2 * y))
print(y // 2)

Exercice 13#

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

def majeur(age):
  if ... :
    return True
  else:
    return False

# Demandez son âge à l'utilisateur
age = ...

if majeur(age):
  print("Tu as le droit de vote")
else:
  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ère dans laquelle tous les s de txt ont été remplacé par t.

txt.lower()

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

txt.upper()

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

Exercice 14#

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 15#

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


Exercice 16#

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.

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

Exercice 17#

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.

message = "Codez ce message!"