Exercices sur les fonctions

Que fait cette fonction ?

Répondre aux questions de cet exercice sans s’aider de l’ordinateur, puis vérifier.

  1. On souhaite calculer \(\sum \frac{1}{i}\). Quelle est la différence entre les différentes fonctions si dessous ? Laquelle est la “bonne” fonction, laquelle la “pire”

def serie_1(n):
    output = 0
    for i in range(1, n+1):
        output = output + 1/i
        print(output)
        
serie_1(5)
        
def serie_2(n):
    output = 0
    for i in range(1, n+1):
        output = output + 1/i
        return output

serie_2(5)    
    
def serie_3(n):
    output = 0
    for i in range(1, n+1):
        output = output + 1/i
    print(output)
    
serie_3(5)

        
def serie_4(n):
    output = 0
    for i in range(1, n+1):
        output = output + 1/i
    return output

serie_4(5)
1.0
1.5
1.8333333333333333
2.083333333333333
2.283333333333333
2.283333333333333
2.283333333333333
  1. Parmi tous les appels de la fonction f ci dessous, lequels vont faire une erreur ? Quelle sera l’erreur ?

def f(a, b):
    return a*2 + b

p = [1, 2]
f(1, 3, 4)
f(1, 2)
f(Bonjour, Hello)
f(1, a=2)
f(b=1, a=2)
f("Bonjour", "Hello")
f[1, 2]
f("Bonjour, Hello")
f(1)
f(**p)
f(*p)
  1. Qu’est il affiché ? Dans quels fonction x est une variable globale ?

def f1(x, y):
    print(x + y)

def f2(y):
    x = 15
    print(x + y)

def f3(x, y):
    print(x + y)
    x = 15

def f4(y):
    print(x + y)
    x = 15

x = 10
f1(1, 2)
x = 5
f1(1, 2)
f2(1)
print(x)    
f3(1, 2)
f4(1) # Attention, il y a un piège ici.
3
3
16
5
3
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-3-bf7078096a9a> in <module>
     21 print(x)
     22 f3(1, 2)
---> 23 f4(1)

<ipython-input-3-bf7078096a9a> in f4(y)
     11 
     12 def f4(y):
---> 13     print(x + y)
     14     x = 15
     15 

UnboundLocalError: local variable 'x' referenced before assignment
  1. Qu’est il affiché ?

from math import sin

pi = 3.141592653589793

def g():
    return sin(pi/2)
    
def f():
    pi = 0
    return sin(pi/2)

print(f())
print(g())
pi = 0
print(f())
print(g())
0.0
1.0
0.0
0.0
  1. Qu’est il affiché ?

def f(a, b, c):
    print(100*a + 10*b + c)

a = 1
b = 2
c = 3
f(a, b, c)
f(c, b, a)
f(a, b=c, c=b)
f(a=a, b=a, c=a)
123
321
132
111

Fonction cos_deg

Ecrire une fonction qui renvoie le cosinus d’un angle exprimé en degré

from math import cos, pi

def cos_deg(angle):
    return cos(angle/180*pi)

Volume d’un cône

  1. Ecrire une fonction qui renoit le volume d’un cône de rayon \(r\) et hauteur \(h\).

  2. Ecrire une fonction qui envoit le volume d’un tronc de cône de rayon \(r_1\) et \(r_2\).

  3. Ecrire une seule fonction pour laquelle le tronc de cône est par défaut un cône (i.e. \(r_2=1\))

from math import pi

def volume_cone(h, r):
    return pi*h*r**2/3

def volume_tronc_cone(h, r1, r2):
    return pi*h*(r1**2 - r2**2)/3

def volume_tronc_cone(h, r1, r2=0):
    return pi*h*(r1**2 - r2**2)/3

Fonction datetime

Importer la fonction datetime du module datetime et regarder se documentation.

  1. Utiliser cette fonction pour entrer votre date de naissance (et l’heure si vous la connaissez) en nomant explicitement les arguments.

  2. Même question mais après avoir mis les arguments dans une liste

  3. Dans un dictionnaire

from datetime import date, datetime

print(date(year=2011, month=6, day=2))

liste = [2011, 6, 2]

print(date(*liste))

parametre = {'year':2011, 'month':6, 'day':2}

print(date(**parametre))
2011-06-02
2011-06-02
2011-06-02

Fonction date en français

  1. Ecrire une fonction date_en_francais qui renvoie un objet date mais dont les arguments sont en français (annee, mois, jour)

  2. Idem avec la fonction datetime du module datetime (il faudra rajouter les arguments optionels heure, minute, seconde)

def date_fr(annee, mois, jour):
    return date(annee, mois, jour)

print(date_fr(annee=2011, mois=6, jour=2))

def datetime_fr(annee, mois, jour, heure=0, minute=0, seconde=0):
    return datetime(annee, mois, jour, heure, minute, seconde)

print(datetime_fr(annee=2011, mois=6, jour=2, heure=15))
2011-06-02
2011-06-02 15:00:00

Polynômes

On considère un polynôme de degrés \(n\) : \(a_0 + a_1x + a_2x^2 + ... + a_n x^n\).

  1. Ecrire une fonction eval_polynome_troisieme_degres(x, a_0, a_1, a_2, a_3) qui évalue un tel polynôme en \(x\).

  2. Ecrire une fonction qui permettra d’évaluer un polynôme de degré inférieur à 4 est que l’on pourra utiliser de la façon suivante :

     eval_polynome(x, 3, 4) # 3x + 4
     eval_polynome(x, a_0=2, a_2=4) # 4x^2 + 4
    
  3. Faire en sorte que cette fonction marche pour n’importe quel degré.

def eval_polynome_troisieme_degres(x, a_0, a_1, a_2, a_3):
    return a_0 + a_1*x + a_2*x**2 + a_3*x**3

def eval_polynome(x, a_0=0, a_1=0, a_2=0, a_3=0, a_4=0):
    return a_0 + a_1*x + a_2*x**2 + a_3*x**3 + a_4**4

def eval_polynome(x, *a):
    output = 0
    for i, val_a in enumerate(a):
        output += val_a*x**i
    return output
   
x = 10
eval_polynome(x, 3, 4)
43

Equation du second degré

On souhaite trouver les solutions de l’équation : \(ax^2 + bx + c=0\). On rappelle que pour cela on calcule le discriminant \(\Delta = b^2 - 4*a*c\).

  • Si \(\Delta>0\), les solutions sont \(\frac{-b \pm \sqrt{Delta}}{2a}\)

  • Si \(\Delta=0\), il y a une solution (double) \(\frac{-b }{2a}\)

  • Si \(\Delta<0\), les solutions sont \(\frac{-b \pm i\sqrt{Delta}}{2a}\)

  1. Ecrire une fonction equation_second_degre qui donne les solutions.

  2. Tester l’équation \(x^2 -3x + 2\)

  3. Ecrire une fonction qui résout une équation du premier degré.

  4. Faire en sorte que cette fonction soit appelée lorsque \(a=0\).

from math import sqrt

def equation_seconde_degre(a, b, c):
    Delta = b**2 - 4*a*c
    if Delta>0:
        return (-b + sqrt(Delta))/(2*a), (-b - sqrt(Delta))/(2*a)
    if Delta==0:
        return -b/(2*a)
    if Delta<0:
        return (-b + sqrt(-Delta)*1J)/(2*a), (-b - sqrt(-Delta)*1J)/(2*a)
    
print(equation_seconde_degre(1, -3, 2))

def equation_premier_degre(a, b):
    return -b/a

def equation_seconde_degre(a, b, c):
    if a==0:
        return equation_premier_degra(b, c)
    Delta = b**2 - 4*a*c
    if Delta>0:
        return (-b + sqrt(Delta))/(2*a), (-b - sqrt(Delta))/(2*a)
    if Delta==0:
        return -b/(2*a)
    if Delta<0:
        return (-b + sqrt(-Delta)*1J)/(2*a), (-b - sqrt(-Delta)*1J)/(2*a)

# Dans cet exercice, les else ou elif sont inutiles.
(2.0, 1.0)

Coordonnée polaire d’un nombre complexe

On considère une nombre complexe \(z\) et sa représentation polaire : \(z = re^{i\theta}\)

  1. Ecrire une fonction qui à partir de \(r\) et \(\theta\) renvoie \(z\)

from math import cos, sin, pi

def from_polar(r, theta):
    return r*cos(theta) + 1J* r*sin(theta)
    
from_polar(1, pi/2)
(6.123233995736766e-17+1j)

Nombres premiers

Ecrire une fonction qui renvoie True si un nombre est premier et False sinon. Pour cela, on testera si le nombre est divisible par les entiers successifs à partir de 2.

On admet que si \(n\) n’est pas premier, alors il existe un entier \(p \ge 2\) tel que \(p^2 \le n\) qui est un diviseur de \(n\).

  1. Ecrire la fonction à l’aide d’une boucle.

  2. Combien y a t-il d’années au XXIème siècle qui sont des nombres premiers ?

  3. Si vous n’êtes pas convaincu que c’est mieux avec des fonctions, faites le sans…

def est_premier(n):
    p = 2
    while p**2<=n:
        if n%p==0:
            return False
        p += 1
    return True

est_premier(7)

count_premier = 0
for annee in range(2001, 2101):
    if est_premier(annee):
        count_premier += 1
print(f'Il y a {count_premier} années premières aux XXI siècle')

Mention

Ecrire une fonction qui à partir de la note sur 20 donne la mention

def mention(note):
    if note>=18:
        return 'Felicitation'
    if note>=16:
        return 'Très bien'
    if note>=14:
        return "Bien"
    if note>=12:
        return "Assez bien"
    return 'Pas de mention'