COURS/TP 3 : les fonctions

Introduction

Le programme

In [16]:
print("saisir deux entiers :")
n = int(input())
m = int(input())
print(n**2+ m**2)
saisir deux entiers :
13

permet de calculer la somme des carrés de deux entiers. Un inconvénient de celui-ci est que l'on effectue seulement un affichage. On ne peut stocker la valeur calculée. De plus, le programme demande à l'utilisateur de saisir deux valeurs. Il nous n'est donc pas possible d'effectuer des calculs sur un grand nombre de valeurs de manière automatique. L'utilisation des fonctions nous permettra de remédier à ce type de problèmes.

1. Différence entre affichage et valeur de retour

Avant d'aborder la notion de fonction, il nous est important de différencier "affichage" et "valeur de retour". Considérons les programmes suivants :

In [17]:
print("toto")
toto
In [18]:
S = "toto"
S
Out[18]:
'toto'

Dans le premier cas, on a un affichage tandis que dans le deuxième cas, on a une valeur de retour. Pour un affichage, l'ordinateur montre simplement ce qu'on lui demande. Il n'est pas possible de récupérer la valeur affichée. Pour une valeur de retour, on peut réutiliser la valeur. Il est possible qu'une valeur de retour ne soit pas affichée.

2. Structure d'une fonction

2.1 Exemples

Écrivons une fonction permettant de calculer la somme des $n$ entiers :

In [20]:
# somme des n premiers entiers
def somme(n) :
    S = 0
    for i in range(n) :
        S = S+i
    return S
somme(5)
Out[20]:
10

Un exemple de traitement automatique :

In [21]:
for i in range(20) :
    print(somme(i))
0
0
1
3
6
10
15
21
28
36
45
55
66
78
91
105
120
136
153
171

Voici un exemple de fonction qui n'a pas de valeur de retour et qui effectue un affichage :

In [22]:
def affiche(n) :
    for i in range(n) :
        print(i)
    return
affiche(4)    
0
1
2
3

Une fonction peut également ne pas avoir d'argument :

In [23]:
def fortune() :
    saisie = int(input())
    while saisie != 168 :
        saisie = int(input())
    print("en route vers la fortune !")
    return
fortune()
en route vers la fortune !

2.2 Syntaxe

Toutes les fonctions Python s'écrivent ainsi :

In [16]:
def nom_fonction(a1,a2,a3) : # on pourrait rajouter des arguments.
    instructions
    return (valeur)    # il se peut qu'il n'y ait pas de valeur de retour.

Le mot-clé def permet donc de définir une fonction. Il ne faut pas non plus oublier les : après avoir défini le prototype de la fonction.

3. Portée d'une variable

Les variables définies à l'intérieur d'une fonction n'existent pas à l'extérieur de celle-ci. Illustrons ce propos :

In [28]:
def test() :
    dd = "dédé"
    return dd
dd = test()
print(dd)
dédé

Constatons que la variable 'S' est définie à l'intérieur de la fonction test mais n'est pas définie à l'extérieur. Pour récupérer une valeur calculée, on peut procéder ainsi :

In [29]:
def somme_carre(n) : 
    S = 0
    for i in range(n) :
        S = S+i**2
    return S
valeur = somme_carre(100)
print(valeur)
328350

4. Travaux pratiques

Terminer les exercices du TP précédents puis traiter les exercices suivants.

Exercices à faire

Exercice 1.

  1. Écrire une fonction factorielle(n) qui retourne la valeur de $n!$. (On rappelle que $n!=1\cdot 2 \ldots n$ et $0!=1$)
  2. Calculer $30!$.
  3. En déduire une fonction binomial(n,k) qui retourne la valeur de $\binom{n}{k}$. (On rappelle que $\binom{n}{k}=\frac{n!}{k!(n-k)!}$ pour $n\geq k \geq 0$.)
  4. Calculer $\binom{25}{12}$.

Exercice 2.

Écrire une fonction suite(n,a) qui renvoie $u_n$ où la suite $(u_n)_{n\in \mathbb{N}}$ est définie par : $$ u_0=a, \forall n \in \mathbb{N}, u_{n+1}=2u_n-3. $$

Exercice 3.

Écrire une fonction somme(n,i) qui renvoie la valeur $\left(\sum_{j=1}^{n^2} \frac{i(j+1)}{2}\right)$. (on rappelle que $\sum_{k=1}^{p} a_k$ signifie $a_1+a_2+...+a_p$)

Exercice 4.

Écrire une fonction terme(n,a) qui renvoie $u_n$ où la suite $(u_n)_{n\in \mathbb{N}}$ est définie par $$ u_0=a, u_1=1+2a, \forall n \in \mathbb{N}, u_{n+2}=2u_{n+1}-5u_n. $$

Pour les plus rapides

Les exercices portant la mention "difficile" peuvent être abordés ultérieurement.

Exercice 5.

Écrire une fonction variante(x) qui prend en argument un réel $x$ positif et qui trouve le plus grand entier $n$ vérifiant : $0+1+2+\cdots+n\leq x$.

Exercice 6.

Écrire une fonction somme_deux_carres(n) qui prend en argument un entier naturel $n$ et qui renvoie Trues'il existe deux entiers $a$ et $b$ vérifiant $a^2 + b^2 = n$. La fonction renvoie False sinon.

Exercice 7. (difficile)

Un habitué du jardin du Luxembourg nourrit régulièrement une horde de pigeons. On sait que les pigeons arrivent toujours de la manière suivante :

  • la première minute, un pigeon se présente,
  • la deuxième minute, deux pigeons le rejoignent,
  • la troisième minute, trois pigeons intègrent le groupe,
  • et ainsi de suite.

Sachant qu'un pigeon picore une portion de miettes de pain en une minute, qu'il n'est jamais rassasié, et que les premiers pigeons sont les premiers servis, écrire une fonction nourrirPigeon(NbrePortions) qui prend en argument un entier qui correspond aux nombres de portions de miettes de pain, et qui renvoie le nombre de pigeons ayant été nourri au moins une fois.

Exercices supplémentaires (chaînes de caractères)

Exercice 8. (difficile)

Écrire une fonction est_present(texte,motif) qui prend en argument deux chaînes de caractères et qui renvoie True si motif apparaît au moins une fois dans texte et False sinon. Par exemple, la valeur de retour de est_present("Speedy est un rat", "est") est True et la valeur de retour de est_present("faites vos jeux, rien ne va plus", "jouer") est False.

Exercice 9.

Écrire une fonction nombre_voyelles(texte) qui prend en argument une chaîne de caractères et qui renvoie le nombre de voyelles présentes dans texte.

Indication : étant donnés une chaîne de caractères texte et un entier $i$, texte[i] désigne le caractère de rang $i$ de texte. Par exemple, si texte = "miaous" alors texte[3] est égal à $o$. On rappelle que l'indexation commence au rang $0$. De plus, len(texte) nous donne la longueur de la chaîne texte. Dans l'exemple, on a len(texte) égale à $6$. Il est possible de comparer deux caractères avec le symbole ==.

Exercice 10.

Écrire une fonction lettres_consecutives_id(texte) qui prend en argument une chaîne de caractères et qui renvoie True si le texte contient deux lettres consécutives identiques et False sinon.

Indication : il existe une dissymétrie entre le VRAI et le FAUX. En effet, pour montrer que c'est VRAI, il suffit de trouver deux lettres consécutives identiques. Par contre, pour montrer que c'est FAUX, il faut vérifier que dans tout le texte il n'y a pas deux lettres consécutives identiques.

Exercices supplémentaires (étude de suites et calculs)

Exercice 11.

Écrire une fonction somme_alternee(n) qui prend en argument un entier $n>0$ et qui renvoie la valeur $\sum_{k=1}^{n} \frac{(-1)^{k-1}}{k}$.

Exercice 12.

Écrire une fonction somme_double(n) qui prend en argument un entier $n>0$ et qui renvoie la valeur $\sum_{1\leq i\leq j\leq n}(j-i)^3$.

Indication : pour effectuer des sommes doubles, on peut utiliser deux boucles for imbriquées.

Exercice 13.

On définit la suite $(u_n)_{n\in \mathbb{N}}$ par : $u_0\in [0,1], \forall n \in \mathbb{N}, u_{n+1}=4u_n (1-u_n)$. Écrire une fonction maxi(u0,n) qui prend en argument un réel $u_0$ compris entre $0$ et $1$ et un entier naturel $n$ et qui renvoie la valeur $\max_{0\leq i \leq n}(u_i)$.

Indication : un problème dissymétrique entre le VRAI et le FAUX.

Exercice supplémentaire (le reste est trop facile....)

Exercice 14. (difficile)

La conjecture de Golbach affirme que tout nombre pair strictement supérieur à 2 peut s'écrire comme somme de deux nombres premiers. Par exemple, $4=2+2, 6=3+3, 8=5+3$.

  1. Écrire une fonction est_premier(n) qui prend en argument un entier naturel $n$ et qui renvoie True si celui-ci est effectivement premier et False sinon.

  2. Écrire une fonction couple_G(n) qui prend en argument un entier naturel $n$ pair supérieur strict à $2$ et qui renvoie un couple de nombres premiers $p,q$ vérifiant $p+q=n$.

  3. (Vous voulez rester dans la postérité) Démontrer la conjecture de Golbach.

In [ ]: