Python et fonction à nombre variable d’arguments

Python et fonction à nombre variable d’arguments

Voici une astuce qui pourra sans doute servir à plusieurs d’entre vous : je vais vous parler des fonctions Python qui peuvent admettre un nombre variable d’arguments.

fonction Python à un nombre variable d'arguments
fonction Python à un nombre variable d’arguments

Une fonction peut quelques fois devoir prendre un nombre variable d’arguments. Par exemple, si l’on souhaite calculer le PGCD de plusieurs nombres, on aimerait que la fonction PGCD (par exemple) accepte 2, 3, 4, … arguments.

Calcul du PGCD de plusieurs nombres

Voici sur un exemple comment faire:

def pgcd(*n):
	def _pgcd(a,b):
		while b!=0:
			a,b = b,a%b
		return a
	p = _pgcd(n[0],n[1])
	for x in n[2:]:
		p = _pgcd(p,x)
	return p

print(pgcd(165,515,225,65))

Cette méthode s’appelle l’unpacking. Regardons à travers un deuxième exemple.

Somme de plusieurs nombres

On va définir ici une fonction “somme”:

def somme(*n):
    s = 0
    for i in n:
        s += i
    return s

Cette fonction permet de calculer la somme d’un nombre variable d’arguments. Par exemple:

somme(1,2,3,4,5)

retourne $$1+2+3+4+5=15.$$Et:

somme(15,12,2,20,12,1,2)

retourne:$$15+12+2+20+12+1+2=64.$$

  • 1 splat (1 étoile) : liste
  • 2 splats (2 étoiles) : dictionnaire

En effet, si l’on souhaite récupérer les arguments dans un dictionnaires, on utilise le double splat.

Un exemple basique avec double splat

def fonction(**kwargs):
    for key,value in kwargs.items():
        print('{} -> {}'.format(key,value))

fonction(a = 1, b = 2, c = 5)
a -> 1
b -> 2
c -> 5

À travers cet exemple, on voit bien le fonctionnement de l’unpacking avec le double splat. Il est à noter qu’en général, on note kwargs pour le double splat (contraction de “keyword arguments”), mais ce n’est pas obligatoire.

On peut aussi mélanger le splat et le double splat.

Mélange de splat et double splat

def fonction(*args , **kwargs):
    for i in args:
        print(i)
    for key,value in kwargs.items():
        print('{} -> {}'.format(key,value))
        
fonction(48 , 52 , 63 , a = 1, b = 2, c = 5)
48
52
63
a -> 1
b -> 2
c -> 5
Stéphane Pasquet
Stéphane Pasquet

Laissez votre message