

6. Fonctions et procédures#

%matplotlib inline
import numpy as np
from IPython.display import HTML,display,IFrame,Video
from IPython.display import YouTubeVideo,Markdown
display(Markdown("**Video du cours: Introduction**"))
YouTubeVideo('Q_yFr7sdyc0')
Video du cours: Introduction
Astuce
pour tester les programmes Python, vous pouvez vous connectez sur un serveur Jupyter, par exemple, pour les étudiants Lyon1 https://jupyter.mecanique.univ-lyon1.fr
6.1. Procédure et fonction#
6.1.1. Procédure#
procédure: algorithme avec des paramètres d’entrée (données) et des paramètres de sortie (résultat)
Algorithme MaFonction(liste de paramètres)
variables locales
instructions
retour (liste de valeurs)
# utilisation
val = MaFonction(param1,param2,..)
display(Markdown("**Video du cours: procédure et fonction**"))
YouTubeVideo('CAsiebHnHAs')
Video du cours: procédure et fonction
6.1.2. Fonction en Python#
implémentation d’une procédure = function (C, Python) , subroutine (Fortran)
# définition
def MaFonction(liste arguments):
instructions
....
return (liste de valeurs)
# utilisation
(val1, val2, ..) = MaFonction(arg1, arg2, ...)
6.1.3. Passage des arguments#
on affecte aux arguments de la fonction la valeur des paramètres d’appel:
def MaFonction(a1, a2, a3):
....
return (v1, v2)
(V1, V2) = MaFonction(A1, A2, A3)
lors de l’appel, on a a1=A1 a2=A2 a3=A3
valeur de retour = liste
lors du retour, V1=v1, V2=v2
Exemple Python
utilisation du site : http://pythontutor.com
vous pouvez copier l’exemple de code python sur le site pour l’exécuter
# definition
def MaFonc(a1,a2,a3):
v1 = a1 + a3
v2 = a2 + a3
return v1,v2
# utilisation
A1 = 1.0
V1,V2 = mafonc(A1,a.2,4*A1)
display(Markdown("**Visualisation de l'execution sur le site pythontutor**"))
Video("VIDEO_COURS/pythonlive_fonc1.mp4", embed=True,width=700, height=300)
Visualisation de l’execution sur le site pythontutor
6.1.4. Passage des arguments#
pour les variables scalaires: valeur = valeur de la variable
la variable n’est donc pas modifiée
pour les listes et tableaux: valeur = adresse des données
on peut donc modifier la valeur d’une liste ou tableau en argument
mais à condition de ne pas faire de réaffectation
Exemple Initialisation de liste (tableau) : version 1
# definition
def InitTab(X):
X[:] = [0,0,0]
n = len(X)
for i in range(n):
X[i] = i*i
return
# utilisation
Z = [1,1,1]
InitTab(Z)
display(Markdown("**Video du cours: arguments d'une fonction**"))
YouTubeVideo('I0uizg3B6LU')
Video du cours: arguments d’une fonction
display(Markdown("**Visualisation de l'execution sur le site pythontutor**"))
Video("VIDEO_COURS/pythonlive_fonc2.mp4", embed=True,width=700, height=300)
Visualisation de l’execution sur le site pythontutor
Initialisation de liste (tableau): version 2
# definition
def InitTab(X):
X = [0,0,0]
n = len(X)
for i in range(n):
X[i] = i*i
return
# utilisation
Z = [1,1,1]
InitTab(Z)
display(Markdown("**Visualisation de l'execution sur le site pythontutor**"))
Video("VIDEO_COURS/pythonlive_fonc3.mp4", embed=True,width=700, height=300)
Visualisation de l’execution sur le site pythontutor
Questions ?
comparer la valeur de Z après l’appel de la fonction
InitTab
!à quoi correspond la variable X dans la fonction
InitTab
6.2. Exemples de procédures et de fonctions#
display(Markdown("**Video du cours: exemple de procédure et fonction**"))
YouTubeVideo('1RWcWyOF2g8')
Video du cours: exemple de procédure et fonction
Attention
Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print
est un mot clé,
soit print 'bonjour'
.
Avec Python 3, print
est une fonction et il faut donc utiliser des parenthèses,
soit print('bonjour')
6.2.1. Algorithme d’Euclide: calcul du PGCD de 2 entiers#
# Calcul du PGCD
# paramètres d'entrée: 2 entiers positifs a et b
# en sortie: PGCD de a et b
#
Algorithme PGCD(a,b)
tant que a # b
si a>b alors a = a-b
sinon b = b - a
retour a
#
6.2.1.1. Programme Python#
def PGCD(a, b):
"""
Calcul du PGCD de a et b (entiers positifs)
"""
while a != b:
if a > b:
a = a - b
else:
b = b - a
return a
# utilisation
a0, b0 = 15623532, 252568
p = PGCD(a0, b0)
print("PGCD de ", a0, b0, "=", p)
PGCD de 15623532 252568 = 4
6.2.2. Algorithme: calcul de la somme d’une série#
# calcul de la somme Sn et de l'Écart par rapport à la limite
# entrée: n entier sortie: somme, écart par rapport à limite
Algorithme Somme(n)
S=0.
pour i de 1 a n
S = S + 1./i**2
err = S - (pi**2/6.)
retour S,err
6.2.2.1. Programme Python#
# fonction Python
def Somme(n):
"""
Calcul de la somme de la série 1/i**2 pour i de 0 a n
en sortie: somme et écart par rapport à la limite
"""
S=0.
for i in range(1, n + 1):
S = S + 1. / (i*i)
ecart = S - (np.pi**2/6.)
return S, ecart
#
n = 100
S, err = Somme(n)
print("somme=",S," erreur=",err)
print(Somme(1000))
print(Somme(10000))
somme= 1.6349839001848923 erreur= -0.009950166663334148
(1.6439345666815615, -0.0009995001666649461)
(1.6448340718480652, -9.999500016122376e-05)
6.3. Paramètres optionnels d’une fonction#
En Python possibilité de définir des paramètres optionnels avec une valeur par défaut
Nommage des paramètres (ordre indifférent)
Très utilisés dans les fonctions des bibliothèques
# Déclaration def MaFonction(par, par1=valdef1, par2=valdef2) # Appel MaFonction(val) MaFonction(val, par1=val1) MaFonction(val, par2=val2, par1=val1)
display(Markdown("**Video du cours: paramètres optionnels**"))
YouTubeVideo('fUDdLOxc2c0')
Video du cours: paramètres optionnels
Attention
Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print
est un mot clé,
soit print 'bonjour'
.
Avec Python 3, print
est une fonction et il faut donc utiliser des parenthèses,
soit print('bonjour')
6.3.1. Exemple: algorithme de Héron (calcul de \(\sqrt{x}\))#
Pour calculer une approximation \(u\) de \(\sqrt{a}\), on note que si \(u\approx\sqrt(a)\) alors \(a/u\approx\sqrt(a)\) et donc \(\frac{u + a/u}{2}\) est sans doute une meilleur approximation de \(\sqrt{a}\).
On peut vérifier que cette méthode babylonienne est en fait un cas particulier de la méthode de Newton pour calculer la racine de \(f(x)=u^2-a\)
6.3.1.1. Algorithme#
Algorithme Heron(a)
u = a/2
eps = 1.e-6
tant que |u**2 - a| > eps
u = (u + a/u)/2
fin tantque
retour u
6.3.1.2. Programme Python#
import numpy as np
def Heron(a, eps=1e-03, itmax=100):
"""
calcul une approximation de sqrt(a) avec une precision eps
et une nombre maxi d'iterations itmax """
u = a/2.
it = 0
while abs(u**2 - a) > eps:
u = (u + a/u) / 2.
it = it + 1
if it > itmax:
print("Attention nbre maxi d'iterations atteint", it)
break
return u, it
# utilisation
b = 200.
print("sqrt(200) ~",Heron(b))
print("a 10^-8 pres sqrt(200) ~",Heron(b, 1.e-08))
print("a 10^-13 pres sqrt(200) ~",Heron(b, eps=1.e-13))
print("a 10^-14 pres sqrt(200) ~",Heron(b, eps=1.e-14))
print("a 10^-14 pres sqrt(200) ~",Heron(b, itmax=200, eps=1.e-14))
print("valeur avec numpy ",np.sqrt(b))
sqrt(200) ~ (14.142135968022693, 6)
a 10^-8 pres sqrt(200) ~ (14.142135623730955, 7)
a 10^-13 pres sqrt(200) ~ (14.142135623730951, 8)
Attention nbre maxi d'iterations atteint 101
a 10^-14 pres sqrt(200) ~ (14.142135623730951, 101)
Attention nbre maxi d'iterations atteint 201
a 10^-14 pres sqrt(200) ~ (14.142135623730951, 201)
valeur avec numpy 14.142135623730951
6.4. Fonction Lambda#
permet de définir des mini-fonctions (à la Lisp)
utile pour des fonctions simples (mais pas obligatoire!!)
définition fonction F(args) où args est la liste des arguments
F = lambda args : expression(args)
import numpy as np
F = lambda x: np.cos(x**2)
print(F(1))
G = lambda x, y: F(x) + y**2
print(G(1, 1))
0.5403023058681398
1.5403023058681398
6.5. Méthodes, classes et fonctions de bibliothèque#
6.5.1. Définition#
classe = type de structure de données définissant des données + fonctions pour manipuler ces données
méthode = fonction associée à une classe pour manipuler les données de la classe
objet = instance de classe = variable [données + méthodes]
sous Python toute variable (list, string, real, int) est un objet et possède des méthodes (p.e pour l’afficher)
display(Markdown("**Video du cours: notion de classes et méthodes**"))
YouTubeVideo('N6TLygH5p4c')
Video du cours: notion de classes et méthodes
Attention
Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print
est un mot clé,
soit print 'bonjour'
.
Avec Python 3, print
est une fonction et il faut donc utiliser des parenthèses,
soit print('bonjour')
6.5.2. Syntaxe d’utilisation d’une méthode sous Python#
pour un objet A avec un methode func1
A.func1(arg1,arg2,...)
équivalent à
func1(A,arg1,arg2,..)
6.5.3. Exemple en Python#
S="mon nom"
print(S.upper())
L=[1,2,3]
L.reverse()
print(L)
X=3.14157
print(X.as_integer_ratio())
MON NOM
[3, 2, 1]
(7074186740679165, 2251799813685248)
6.5.4. Aide sous Ipython#
Sous Ipython, pour avoir la liste des méthodes associées à un objet A
A. <tab> # liste des methodes
A.meth? # aide sur la methode meth
exemple
np.abs?
renvoie
Call signature: np.abs(*args, **kwargs)
Type: ufunc
String form: <ufunc 'absolute'>
File: /usr/local/lib/python3.8/dist-packages/numpy/__init__.py
Docstring:
absolute(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj])
Calculate the absolute value element-wise.
``np.abs`` is a shorthand for this function.
Parameters
----------
x : array_like
Input array.
out : ndarray, None, or tuple of ndarray and None, optional
A location into which the result is stored. If provided, it must have
a shape that the inputs broadcast to. If not provided or None,
a freshly-allocated array is returned. A tuple (possible only as a
keyword argument) must have length equal to the number of outputs.
where : array_like, optional
This condition is broadcast over the input. At locations where the
condition is True, the `out` array will be set to the ufunc result.
Elsewhere, the `out` array will retain its original value.
Note that if an uninitialized `out` array is created via the default
``out=None``, locations within it where the condition is False will
remain uninitialized.
**kwargs
For other keyword-only arguments, see the
:ref:`ufunc docs <ufuncs.kwargs>`.
Returns
-------
absolute : ndarray
An ndarray containing the absolute value of
each element in `x`. For complex input, ``a + ib``, the
absolute value is :math:`\sqrt{ a^2 + b^2 }`.
This is a scalar if `x` is a scalar.
6.5.5. Fonctions d’une bibliothéque#
espace de nom = nom de la bibliothéque bibli
import bibli
nom de la fonction func dans la bibliothéque
bibli.func
bibli.sous_bibli.func
simplification du nommage
import bibli as bib
import bibli.sous_bibli as sbib
importation d’une fonction
from bibli import func
import numpy as np
print(np.sqrt(3))
from numpy import tanh
print(tanh(1))
1.7320508075688772
0.7615941559557649
6.6. Bibliographie#
Les classes sous Python
chapitre du livre « Apprendre à programmer avec Python »
« Apprendre à programmer avec Python » de Gérard Swinnen
6.7. Fin de la leçon#
