Accueil

Traduction

Tutoriel Python - sommaire

Tutoriel Python - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Les fonctions natives et personnelles en Python

Vous avez déjà utilisé de nombreuses fonctions natives de Python : print(), len(), type(), list(), etc.

Les fonctions natives et mots clés

Ci-desssous tableau de toutes les fonctions natives ou génériques ("built-in functions" en anglais) :

Ces fonctions sont toujours disponibles car stockées dans le module de base de Python.
Ci-dessous une série de commandes pour vous familiariser avec les plus importantes de ces fonctions.

>>> maliste =[7,3,5,1,9]
>>> sorted(maliste)
[1, 3, 5, 7, 9]
>>> max(maliste)
9
>>> min(maliste)
1
>>> sum(maliste)
25
>>> int(15.5)
15
>>> eval("15.5")
15.5
>>> chaine_num ="15.5"
>>> int(float(chaine_num))
15
>>>
>>> pow(10,5)
100000
>>> round(17.89,1)
17.9
>>> abs(-10)
10
>>> machaine ="bonjour"
>>> max(machaine)
'u'
>>> min(machaine)
'b'

Ces fonctions sont dites aussi génériques car elles peuvent s'appliquer à différents types de données (à la différence des méthodes de classe qui sont spécifiques à un objet de cette classe).
Ainsi je vous montre que les fonctions min() & max() peuvent avoir pour argument une liste ou une chaine.
La fonction round(nombre décimal,n) arrondit à l'entier le plus proche OU au nombre de décimales si un deuxième argument est précisé.
La fonction pow(x,n ) élève x à la puissance n
eval(chaine numérique) : convertit une chaine en flottant à condition bien sûr que cette chaine ait un format numérique (suite de chiffres avec un point éventuel en guise de séparateur décimal). La fonction float() fait la même chose.

Les mots clés (ou mots réservés) en Python

Ne confondez pas les fonctions natives avec les mots clés.
La liste des mots clés peut être affichée dans la console :

>>> help("keywords")
Here is a list of the Python keywords.  Enter any keyword to get more help.

False               break               for                 not
None                class               from                or
True                continue            global              pass
__peg_parser__      def                 if                  raise
and                 del                 import              return
as                  elif                in                  try
assert              else                is                  while
async               except              lambda              with
await               finally             nonlocal            yield

Vous n'avez pas le droit d'utiliser un mot clé pour définir un identifiant (nom de variable simple, de fonction, de liste, ...).

>>> in = [5,4,3,2]
...
SyntaxError: invalid syntax
>>> del = (5,4,3)
...
SyntaxError: invalid syntax

On ne peut pas nommer une liste, un tuple avec le mot clé "in" ou "del".

Le mot clé "del"

del est aussi une fonction générique !

>>> liste =list(range(2,10))
>>> liste
[2, 3, 4, 5, 6, 7, 8, 9]
>>> del(liste[0])
>>> liste
[3, 4, 5, 6, 7, 8, 9]
>>> del(liste)
>>> liste
...
NameError: name 'liste' is not defined

J'ai supprimé le premier élément de la liste puis toute la liste avec le mot clé del donc la demande d'affichage de cette liste retourne un message d'erreur.

Mais au fait c'est quoi une fonction ?

Une fonction est une portion de code nommée, qui accomplit une tâche spécifique. Les fonctions reçoivent généralement des données en entrée() et retournent généralement en sortie le résultat du traitement opéré par la fonction.

Paramètres et arguments

Définitions

Au propos des fonctions on emploie les termes paramètres et arguments

Les paramètres sont définis lors de la création de la fonction et servent de variables locales à l'intérieur de la fonction.
Les arguments sont les valeurs réelles passées à la fonction lors de son appel et doivent correspondre aux paramètres définis (2 arguments à saisir si deux paramètres obligatoires).

Exemple

>>> divmod(11,3)
(3, 2)
>>> q,r = divmod(11,3)
>>> q
3
>>> r
2
>>>

La fonction générique divmod (division entière) exige deux arguments lors de son appel et retourne deux valeurs.
Elle a donc été définie avec deux paramètres.

Une fonction personnelle

Vous pouvez être appelé à créer vos propres fonctions si vous n'avez pas trouvé votre bonheur dans la liste impressionnante des fonctions proposées par Python : dans le module de base, dans les modules à importer, etc.

Déclaration et appel de la fonction perso.

>>> # déclaration d'une fonction
>>> def carre(x):
...     return x**2
...
>>> carre(5)
25
>>> carre(1000)
1000000

Ci-dessus j'ai défini une fonction perso nommée "carre" avec un paramètre.
Puis j'ai appelé cette fonction deux fois avec d'abord comme argument "5" puis "1000".
La fonction appelée retourne ici une valeur : le carré du nombre saisi en argument.

Syntaxe

L'appel d'un fonction native ou perso. c'est toujours une seule commmande : nomFonction(arg1,arg2, ...)

Le nombre de paramètres peut être variable

La syntaxe de la fonction range() est : range([start],stop,[step]). Ce qui veut dire qu'il peut y avoir trois arguments à saisir lors de son appel mais un seul est obligatoire (stop). Dans la syntaxe une paire de crochets indique un paramètre optionnel.

>>> liste1 = list(range(10))
>>> liste1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> liste2 = list(range(1,10,2))
>>> liste2
[1, 3, 5, 7, 9]
>>>

J'ai appelé deux fois la fonction range() pour créer deux listes : premier appel avec un argument ; deuxième appel avec trois arguments.

À propos de la fonction print()

Un ou plusieurs arguments

La fonction native la plus importante est print().

>>> nom ='Marchand'
>>> prenom ='leon'
>>> age = 22
>>> print(nom, prenom, age, " ans")
Marchand leon 22  ans
>>> print(nom,prenom,age,' ans', sep ='-')
Marchand-leon-22- ans
>>> print(nom,prenom,age,'ans', sep ='')
Marchandleon22ans
>>>

La fonction print() peut être argumentée avec plusieurs expressions (variables, chaines, numériques) séparées par une virgule. Par défaut chaque expression est séparée de la précédente avec un espace.
Mais vous pouvez modifier le type de séparateur voir le supprimer avec le mot clé sep

Saut de ligne ou pas

>>> maliste = list(range(1,11,2))
>>> for ele in maliste :
...     print(ele)
...
1
3
5
7
9
>>> for ele in maliste :
...     print(ele,end ="-")
...
1-3-5-7-9->>>

Par défaut il y a un saut de ligne après l'instruction print() saut si on emploie comme argument le mot clé end = ' '. Il faut préciser le type de séparateur dans les quotes.

Des fonctions personnelles

Je vous propose maintenant de créer vos propres fonctions.

Fonction qui ne retourne aucune valeur

L'instruction return est facultative dans une fonction.
Ci-dessous je définis une fonction qui permet d'afficher une table de multiplication.
Le nombre de données produites est trop important pour être retournées par la fonction. Celle-ci se contente d'afficher les données sous forme d'un tableau grâce à une boucle FOR.

>>> def table(nombre,ligne):
...     for i in range(1,ligne+1):
...             print(f" {i} * {nombre} = {i * nombre}")
...
>>> table(9,10)
 1 * 9 = 9
 2 * 9 = 18
 3 * 9 = 27
 4 * 9 = 36
 5 * 9 = 45
 6 * 9 = 54
 7 * 9 = 63
 8 * 9 = 72
 9 * 9 = 81
 10 * 9 = 90

Cette fonction nommée "table" comprend une boucle for mais pas le mot clé "return"
La syntaxe de la commande "print()" est particulière ; J'y reviendrai plus tard.
Appel de la fonction : j'ai tapé table(9,10) ce qui signifie que je demande l'affichage de la table par 9 et les dix premières lignes.

L'emploi d'une fonction de cette nature dans un programme n'est pas conseillée.
En effet dans un programme on appelle une fonction pour qu'elle retourne une valeur à la routine principale.

Fonction sans paramètre

Il est possible de définir une fonction sans paramètre donc sans passage d'argument lors de son appel.

>>> def instant_present():
...     import time
...     return time.localtime()
...
>>> instant_present()
time.struct_time(tm_year=2024, tm_mon=1, tm_mday=3, tm_hour=12, 
tm_min=7, tm_sec=28, tm_wday=2, tm_yday=3, tm_isdst=0)
>>>

L'instant présent (date et heure) est retourné par la fonction "instant_present" avec moultes détails : année, rang du mois, rang du jour, heure, minutes et secondes.

J'ai définis une fonction "instant_present" qui n'exige aucun argument à passer lors de son appel.

Cette fonction perso. est construite à partir de la fonction localtime() du module time. Voir le chapitre 9.

Fonction sans paramètre et sans valeur retournée

>>> def date_courante():
...     import time
...     print("date du jour : " + time.strftime("%A %d %B %Y"))
...
>>> date_courante()
date du jour : Wednesday 03 January 2024
>>>

La fonction "date_courante" n'exige aucun argument lors de son appel et se contente d'afficher la date du jour. Elle ne retourne aucune valeur que je pourrais récupérer dans une variable en vue d'un traitement ultérieur ...

Création de fonctions "normales"

Entendons par "normale" une fonction perso. qui exige un ou plusieurs arguments lors de son appel et retourne une ou plusieurs valeurs.

La fonction parabole(x)

Création d'une fonction perso. basée sur l'équation : f(x) = x2 + 10 puis appel trois fois de cette fonction.

>>> def  parabole(x):
...     y = pow(x,2)+10
...     return y
...
>>> parabole(-10)
110
>>> parabole(0)
10
>>> parabole(10)
110

pow(x,2) élève à la puissance 2 le contenu de la variable x.
Le bloc d'instructions de cette fonction comprend deux lignes ; toutes deux doivent être indentées par rapport à la ligne "def ..."

Fonction qui retourne plusieurs valeurs

>>> def cercle(r):
...     aire = r * r * 3.14
...     circonference = r*2 * 3.14
...     return aire,circonference
...
>>> a,c = cercle(10)
>>> a
314.0
>>> c
62.8
>>>

La fonction perso nommmée "cercle" reçoit le rayon en argument et retourne la surface et la circonférence du cercle.

Fonction complexes

Je reviens sur les fonctions au chapitre 12.

Fonctions complexes

Fonctions dans les modules

Il ne faut pas confondre vitesse et précipitation. Avant de vous lancer dans la création d'une fonction personnelle complexe, vous devez vous documenter sur les fonctions proposées par Python (qui ne résument pas aux fonctions natives).

En plus des fonctions natives (celles dans le module de base), Python proposent des fonctions dans différents modules. Pour utiliser ces fonctions, il faut donc importer le module en question.

Problématique

Je veux calculer la racine carré de 25. Je sais qu'il existe une fonction de Python qui fait ce travail : sqrt().

>>> sqrt(25)
...
NameError: name 'sqrt' is not defined

l'interpréteur me dit que la fonction sqrt() n'est pas définie ...
En effet cette fonction existe bien mais elle fait partie du module math, module qui n'a pas été importé donc elle n'est pas encore disponible.

Solution

>>> import math
>>> math.sqrt(25)
5.0
>>> math.ceil(18.9)
19
>>> math.floor(18.9)
18
>>>

Pour accéder à toutes les fonctions du module math il suffit de taper la commande import math qui importe la totalité du module : toutes les fonctions.

Attention pour appeler une fonction du module il faut la préfixer avec le nom du module.

Toutes les fonctions du module math

>>> dir(math)
'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh',
'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e',
 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 
'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 
'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm',
'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter',
 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder',
'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
>>>

Il suffit de taper dir(math) pour obtenir la liste des fonctions proposées par ce module.
Vous devinez qu'il y a des fonctions de trigonométrie. J'aurais l'occasion d'y revenir ...
Il y a aussi une fonction nommée "factorial" et une autre nommée "gcd"

Le module random

Il existe un autre module qu'il faut souvent utiliser : random.
En anglais “random” signifie “le hasard”. Ce module propose des fonctions pour générer un réel, un entier de façon aléatoire, etc. Donc si vous voulez programmer des jeux simulant le hasard, ce module est incontournable.

Commandes à saisir dans l'interpéteur

>>> import random as rand
>>> alea = rand.random()
>>> alea
0.6545422177112703
>>> car_retenu = rand.choice(['a','b','c', 'd'])
>>> car_retenu
'c'
>>> entier = rand.randint(5,25)
>>> entier
8
>>>

import random as rand : j'importe le module random et lui donne l'alias "rand". Ainsi je peux préfixer les fonctions du module avec ce pseudo qui est plus court que le nom.

Ne pas "réinventer la roue"

En résumé vous pouvez produire vos propres fonctions mais surtout "ne réinventez pas la roue". Avant de vous lancer dans la création d'une fonction reposant sur un algorithme complexe, recherchez sur la "toile" pour savoir si elle n'existe pas en tant que fonction générique ou dans un module voire dans une bibliothèque (module à installer).

Supposons que vous deviez calculer le plus grand commun diviseur de plusieurs nombres. Il suffit de saisir dans un moteur de recherche : python + plus grand commun diviseur
Le site "koor.fr" vous indique que la fonction se nomme "gcd" et est dans le module "math". Il est précisé aussi que cette fonction est récente : depuis Python 3.5

>>> import math
>>> math.gcd(14,35)
7
>>> math.gcd(60,50,40,30)
10

Il s'agit d'une fonction qui admet un nombre variable de paramètres (voir chapitre 12).

Compléments sur les fonctions génériques de Python

Il y a 72 fonctions internes. Certaines sont très utiles en mathématiques. Aussi faut-il les connaitre.
Ne créer pas une fonction pour traiter la division entière ; elle existe !

>>> ord('a')
97
>>> chr(97)
'a'
>>> bin(64)
'0b1000000'
>>> oct(64)
'0o100'
>>> hex(64)
'0x40'
>>> hex(192)
'0xc0'
>>> divmod(10,3)
(3, 1) # quotient et reste de la division de 10 par 3
>>> y =float("10000.55")
>>> y
10000.55

Attention pour les fonctions bin(),oct(), hex() les deux premièrs caractères de la réponse précisent la base : "0b" ou "0o" ou "0x".

La fonction print et les chaines formatées (f-strings)

Les f-strings existent depuis la version 3.6 de Python. C'est un gros progrès en matière d'affichage de plusieurs expressions avec le même "print()".

Un petit exemple vaut mieux qu'un long discours

>>> nom ="Dubuis"
>>> age = 22
>>> print(nom + " est âge de " + age + " ans")
...
TypeError: can only concatenate str (not "int") to str
>>> print(nom, "est âgé de :" , age, " ans")
Dubuis est âgé de : 22  ans
>>> print(f"{nom} est âgé de {age} ans")
Dubuis est âgé de 22 ans

Pourquoi les f-strings ?

print(nom + " est âge de " + age + " ans") : erreur ! En effet la variable age n'est pas de type str. La concaténation dans un "print()" peut s'avérer délicate. Il aurait fallu écrire : print(nom + " est âgé de : " + str(age) + " ans")

print(nom, "est âgé de :" , age, " ans") : syntaxe lourde avec les séparateurs "," ; à chaque fois ouvrir et fermer les guillemets

print(f"{nom} est âgé de {age} ans") : syntaxe légère : toujours une seule paire de guillemets.

f"{nom} est âgé de {age} ans" est une chaine formatée.
Une chaine formatée est délimitée par des guillemets doubles. et précédé de "f".
Dans une chaine formatée on peut insérer des variables de tout type à condition qu'elles soient entre accolades. C'est la notation "moustache".