6.1. Notions avancées

Python propose quelques fonctionnalités pratiques permettant de programmer plus facilement certaines opérations courantes.

6.1.1. Listes en compréhension

Les listes en compréhension sont un moyen simple et élégant de créer des listes grâce à une expression suivie d’une instruction for, le tout entre crochets ([, ]). Le code ci-dessous illustre comment créer une liste en compréhension contenant le cube des nombres de 0 à 9.

l = [x ** 3 for x in range(10)]
print(l)
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]

L’expression pourrait se lire ainsi : « créer une liste contenant x à la puissance 3 pour tout x dans la liste des entiers de 0 à 10 (exclu) ».

On peut aussi filtrer les valeurs de la liste en ajoutant une instruction if à la fin de la compréhension :

l = [x ** 3 for x in range(10) if x ** 3 > 100]  # on ne garde que les valeurs supérieures à 100
print(l)
[125, 216, 343, 512, 729]

On remarquera que la syntaxe Python est proche de l’expression mathématique correspondante :

\[l = \{ x^3 | x \in [0..10), x^3 > 100 \}\]

6.1.2. Dictionnaires en compréhension

Il est également possible de définir un dictionnaire en compréhension en construisant des paires clé-valeur à partir d’une itération.

fruits = ["pomme", "banane", "kiwi"]
lengths = {e : len(e) for e in fruits}
print(lengths)
{'pomme': 5, 'banane': 6, 'kiwi': 4}

L’expression pourrait se lire ainsi : « créer un dictionnaire contenant des paires de clé-valeur, avec pour clé tout e dans la liste des fruits et pour valeur associée la longueur de e ».

6.1.3. Nombre arbitraire de paramètres nommés

Nous savons définir une fonction recevant un nombre arbitraire de paramètres en faisant précéder le dernier d’un astérisque (*). Python propose une alternative qui utilise deux astérisques (**) au lieu d’un seul. Dans ce cas, la fonction attend un nombre arbitraire de paramètres nommés et les place dans celui précédé des astérisques sous la forme d’un dictionnaire contenant le nom et la valeur de chacun des paramètres.

L’exemple ci-dessous illustre ce mécanisme.

def print_my_info(**attributes):
    print("Mes informations :")
    for key in attributes:  # on itère comme sur n'importe quel dictionnaire
        print(f"- {key:8}: {attributes[key]}")

print_my_info(first="Jean", last="Dupont", age=20, height=180)
Mes informations :
- first   : Jean
- last    : Dupont
- age     : 20
- height  : 180