Cet article va te démontrer 9 fabuleuses astuces Python avec des exemples adaptés aux débutants pour t’aider à écrire du code Python plus élégant dans ton travail quotidien.
« Le beau est mieux que le laid. »
C’est non seulement la première phrase de « The Zen of Python« , mais aussi le credo de tous les développeurs Python.
Mais comment distinguer un code élégant d’un code laid ?
Plus important encore, comment écrire du code Python élégant et de qualité ?
C’est justement l’objectif de cet article 🙂
Liste de mes 9 fabuleuses astuces Python
1. Éviter les boucles imbriquées en Python grâce à la fonction product()
Lorsqu’un programme devient compliqué, tu dois inévitablement écrire des boucles imbriquées. Cependant, les boucles imbriquées rendent les programmes plus difficiles à lire et à maintenir.
Heureusement, tu peux toujours éviter les boucles imbriquées en Python grâce à la fonction intégrée product().
Par exemple, nous avons un programme comme suit qui contient des boucles for imbriquées sur 3 niveaux :
list_a = [1, 2023, 88] list_b = [2, 4, 7, 2000] list_c = [3, 75, 9] for a in list_a: for b in list_b: for c in list_c: if a + b + c == 2097: print(a, b, c) # 88 2000 9
Pour rendre ce code plus net et plus propre, nous pouvons utiliser la fonction product(), qui provient du module itertools, pour optimiser le code :
from itertools import product list_a = [1, 2023, 88] list_b = [2, 4, 7, 2000] list_c = [3, 75, 9] for a, b, c in product(list_a, list_b, list_c): if a + b + c == 2097: print(a, b, c) # 88 2000 9
2. L’opérateur walrus : Une jolie astuce pour les expressions d’assignation
Depuis Python 3.8, il existe une nouvelle syntaxe appelée « opérateur walrus » qui permet d’attribuer des valeurs aux variables dans le cadre d’une expression plus large.
L’opérateur := doit son joli nom aux yeux et aux défenses d’un morse (walrus en anglais).
Cette syntaxe est très facile à comprendre. Par exemple, si nous voulons écrire les deux lignes suivantes de code Python en une seule ligne, comment faire ?
author = "Sun Tzu" print(author) # Sun Tzu
Malheureusement, nous ne pouvons pas placer directement l’affectation dans la fonction print(). Il y aura une TypeError si nous essayons :
print(author="Sun Tzu") # TypeError: 'author' is an invalid keyword argument for print()
Grâce à l’opérateur walrus, nous pouvons vraiment faire cela en une seule ligne :
print(author:="Sun Tzu") # Sun Tzu
3. Opérateur conditionnel ternaire : Écriture d’une structure If-Else simple en une ligne
Les conditions if-else sont partout dans le monde de la programmation. Pour rendre la logique simple facile à exprimer, Python nous fournit l’opérateur ternaire. En termes simples, il permet de mettre une condition if-else en une seule ligne :
min = a if a < b else b
Évidemment, le code ci-dessus est beaucoup plus soigné que le suivant :
if a<b: min = a else: min = b
4. Utiliser les fonctions lambda pour définir des fonctions simples
Si tu souhaites uniquement définir une fonction simple, tu n’as probablement pas besoin d’utiliser la syntaxe traditionnelle pour cela. La fonction lambda est une option plus élégante.
Par exemple, la fonction suivante permet de calculer les nombres de Fibonacci :
def fib(x): if x<=1: return x else: return fib(x-1) + fib(x-2)
Cela fonctionne parfaitement mais le code lui-même est un peu laid. Écrivons une ligne unique pour implémenter la même fonction :
fib = lambda x: x if x <= 1 else fib(x - 1) + fib(x - 2)
5. Compréhensions de listes : Obtenir une liste de manière pythonique
Dire que la compréhension de liste rend ton code élégant est encore un euphémisme. Elle peut te faire gagner beaucoup de temps et d’efforts de saisie tout en gardant ton code lisible. Peu de langages de programmation peuvent faire cela.
Genius = ["Jerry", "Jack", "tom", "rod"] L1 = [name if name.startswith('y') else 'Not Genius' for name in Genius] print(L1) # ['Not Genius', 'Not Genius', 'Not Genius', 'rod']
Je te laisse apprécier l’élégance du programme ci-dessus ainsi que réfléchir au nombre de lignes de code que tu aurais écrit sans l’astuce de la compréhension de liste.
6. Tirer parti des fonctions d’ordre supérieur en Python
Python possède quelques fonctions d’ordre supérieur intégrées qui nous permettent d’écrire facilement certaines logiques courantes.
Par exemple, la fonction map() est une fonction d’ordre supérieur célèbre et fréquemment utilisée. Elle reçoit deux paramètres, l’un étant une fonction et l’autre un itérable. L’exécution de la fonction map appliquera la fonction à chaque élément de l’itérable.
names = ['rOd', 'MARc', 'thoMas', 'LISA'] names = map(str.capitalize, names) print(list(names)) # ['Rod', 'Marc', 'Thomas', 'Lisa']
Comme le montre l’exemple ci-dessus, avec l’aide de la fonction map(), nous pouvons éviter d’écrire une boucle for pour mettre en majuscule chaque mot de la liste des noms.
Une autre fonction d’ordre supérieur célèbre est reduce(). Comme son nom l’indique, elle applique une fonction dans un itérable et effectue l’opération de réduction pour celui-ci.
Par exemple, l’exemple suivant convertit une liste en une chaîne de caractères :
from functools import reduce city = ['P', 'a', 'r', 'i', 's', 2, 0, 2, 4] city_to_str = reduce(lambda x, y: str(x) + str(y), city) print(city_to_str) # Paris2024
7. Opérateurs d’union : Le moyen le plus simple de fusionner des dictionnaires
La fusion de dictionnaires est une exigence courante dans la programmation Python quotidienne. Il existe de nombreuses façons de le faire. Mais elles étaient toutes hideuses avant Python 3.9.
Depuis Python 3.9, nous disposons enfin de la méthode la plus élégante pour fusionner des dictionnaires : l’utilisation des opérateurs d’union.
cities_us = {'New York City': 'US', 'Los Angeles': 'US'} cities_fr = {'Paris': 'FR', 'Biarritz': 'FR'} cities = cities_us|cities_fr print(cities) # {'New York City': 'US', 'Los Angeles': 'US', 'Paris': 'FR', 'Biarritz': 'FR'}
Comme le montre l’exemple ci-dessus, nous pouvons simplement utiliser l’opérateur | pour fusionner les deux dictionnaires différents. Qui plus est, il prend également en charge la fusion in-place :
cities_us = {'New York City': 'US', 'Los Angeles': 'US'} cities_fr = {'Paris': 'FR', 'Biarritz': 'FR'} cities_us |= cities_uf print(cities_us) # {'New York City': 'US', 'Los Angeles': 'US', 'Paris': 'FR', 'Biarritz': 'FR'}
8. Les F-Strings : La technique pythonique de formatage des chaînes string
Presque tous les langages de programmation prennent en charge la syntaxe de formatage des chaînes de caractères. Mais tous ne sont pas aussi élégants que la technique f-string de Python.
pi = 3.1415926 print(f'Pi est approximativement égal à {pi:.2f}') # Pi est approximativement égal à 3.14 id = 1 # besoin d'imprimer un nombre à 3 chiffres print(f"L'id est {id:03d}") # L'id est 001 N = 1000000000 # besoin d'ajouter un séparateur print(f'Sa fortune est de {N:,d}€') # Sa fortune est de 1,000,000,000€
Comme le montre le programme ci-dessus, en utilisant l’astuce de la f-string, nous pouvons appliquer une variable Python et définir ses spécifications de formatage à l’intérieur d’une f-string.
Te souviens-tu de la syntaxe de formatage des chaînes de caractères du langage de programmation C ? Si oui, es-tu d’accord que la syntaxe f-string de Python est beaucoup plus simple ? 🙂
Ce qui rend la technique des f-strings plus étonnante, c’est que nous pouvons intégrer des expressions dans les f-strings. Les expressions intégrées seront évaluées au moment de l’exécution.
L’exemple suivant affichera l’heure d’aujourd’hui à l’aide d’une f-string :
from datetime import datetime print(f"Aujourd'hui, nous somme le {datetime.today()}") # Aujourd'hui, nous somme le 2023-01-31 21:03:17.857360
9. Utilisation d’astérisques pour déballer les itérables et déstructurer les affectations
Comment fusionner une liste, un tuple et un ensemble en une seule liste ?
La méthode la plus élégante consiste à utiliser des astérisques :
A = [1, 2, 3] B = (4, 5, 6) C = {7, 8, 9} L = [*A, *B, *C] print(L) # [1, 2, 3, 4, 5, 6, 8, 9, 7]
Comme indiqué ci-dessus, les astérisques peuvent être utilisés comme préfixes des itérables pour décompresser leurs éléments.
Outre la décompression des itérables, les astérisques peuvent également être utilisés pour déstructurer les affectations en Python :
a, *mid, b = [1, 2, 3, 4, 5, 6] print(a, mid, b) # 1 [2, 3, 4, 5] 6
Comme indiqué ci-dessus, à l’aide d’un astérisque, la variable mid
reçoit les éléments du milieu sous forme de liste.
Merci de m’avoir lu ❤️
Pour aller plus loin sur Python, je t’invite à lire les 10 erreurs Python qui démontrent que tu débutes.