Recherche de site Web

10 fonctions Python cachées que tout développeur devrait connaître


En tant que développeurs, nous nous en tenons souvent à nos fonctions Python intégrées préférées et écrivons parfois même des solutions personnalisées pour des problèmes qui ont déjà des solutions intégrées efficaces. Cependant, la bibliothèque standard de Python regorge de joyaux cachés qui peuvent simplifier notre code et améliorer les performances.

Dans cet article, nous allons explorer certaines fonctions Python moins connues mais incroyablement utiles qui méritent plus d’attention.

1. bisect – Opérations efficaces de liste triée

Le module bisect permet de maintenir des listes triées et de trouver efficacement des points d’insertion, ce qui est particulièrement utile lorsque vous avez besoin de recherches rapides ou de séquences triées dynamiques.

Exemple : Système de suivi des notes

Mettons en œuvre un système qui gère les notes triées, trouve les points d’insertion et détermine les notes alphabétiques de manière dynamique.

from bisect import bisect_left, bisect_right, insort

grades = [60, 70, 75, 85, 90, 95]

Find the correct position to insert a new grade
new_grade = 82
position = bisect_left(grades, new_grade)
print(f"Insert 82 at position: {position}")

Insert while keeping the list sorted
insort(grades, new_grade)
print(f"Grades after insertion: {grades}")

Assign letter grades based on score
def grade_to_letter(score):
    breakpoints = [60, 70, 80, 90]  # F, D, C, B, A
    grades = 'FDCBA'
    position = bisect_right(breakpoints, score)
    return grades[position]

print(f"Score 82 gets grade: {grade_to_letter(82)}")
print(f"Score 75 gets grade: {grade_to_letter(75)}")

2. itertools.pairwise - Traitez facilement les paires consécutives

La fonction par paires génère des paires consécutives dans une séquence, ce qui la rend idéale pour l’analyse des tendances, le calcul des différences et le lissage des données.

Exemple : Analyse des changements de température

Lors de l’analyse des données de température, nous avons souvent besoin de calculer les différences entre des lectures consécutives, de trouver des tendances ou de calculer des moyennes mobiles. Au lieu d’itérer manuellement avec une logique basée sur un index, la fonction par paires d’itertools nous permet de traiter des paires consécutives sans effort.

from itertools import pairwise

temperatures = [20, 23, 24, 25, 23, 22, 20]

Compute temperature differences
changes = [curr - prev for prev, curr in pairwise(temperatures)]
print("Temperature changes:", changes)

Compute moving averages
moving_averages = [(t1 + t2) / 2 for t1, t2 in pairwise(temperatures)]
print("Moving averages:", moving_averages)

Find the largest temperature jump
max_jump = max(abs(b - a) for a, b in pairwise(temperatures))
print(f"Largest temperature change: {max_jump} degrees")

3. statistics.fmean – Moyenne en virgule flottante rapide et précise

La fonction fmean calcule la moyenne plus rapidement et avec une plus grande précision par rapport à mean(), ce qui la rend idéale pour les grands ensembles de données.

Exemple : Comparaison de vitesse entre mean() et fmean()

L’exemple illustre une comparaison des performances entre deux fonctions du module de statistiques de Python : mean() et fmean().

from statistics import mean, fmean
import time

temperatures = [21.5, 22.1, 23.4, 22.8, 21.8] * 100000  

Regular mean
start_time = time.perf_counter()
regular_mean = mean(temperatures)
regular_time = time.perf_counter() - start_time

fmean
start_time = time.perf_counter()
fast_mean = fmean(temperatures)
fast_time = time.perf_counter() - start_time

print(f"Regular mean: {regular_mean:.10f} (took {regular_time:.4f} seconds)")
print(f"fmean: {fast_mean:.10f} (took {fast_time:.4f} seconds)")

fmean est nettement plus rapide, en particulier pour les grands ensembles de données.

4. itertools.takewhile - Traiter jusqu’à ce qu’une condition échoue

La fonction takewhile permet de traiter les séquences jusqu’à ce qu’une condition ne soit plus remplie, offrant ainsi un moyen plus propre de rompre les boucles.

Exemple : Traitement des journaux jusqu’à ce qu’une erreur se produise

Cet exemple montre comment traiter efficacement les entrées de journal jusqu’à ce qu’une erreur soit rencontrée à l’aide de la fonction itertools.takewhile de Python. L’objectif est d’extraire et d’afficher toutes les entrées de journal qui se produisent avant la première entrée d’erreur dans une liste de journaux.

from itertools import takewhile

log_entries = [
    "INFO: System started",
    "INFO: Loading data",
    "INFO: Processing users",
    "ERROR: Database connection failed",
    "INFO: Retrying connection",
]

Retrieve logs until the first error
normal_operation = list(takewhile(lambda x: not x.startswith("ERROR"), log_entries))
print("Logs before first error:")
print("\n".join(normal_operation))

5. operator.attrgetter - Récupérer efficacement les attributs d’objet

La fonction attrgetter simplifie l’extraction d’attributs à partir d’objets, en particulier pour le tri et les attributs imbriqués.

Exemple : Tri des articles de blog par auteur et vues

Ce code montre comment trier une liste d’articles de blog en fonction de plusieurs critères à l’aide de la fonction sorted() de Python avec l’utilitaire attrgetter du module opérateur.

Le tri s’effectue d’abord par le nom de l’auteur (par ordre alphabétique) puis par le nombre de vues (numériquement). Cette approche est utile lorsque vous souhaitez organiser les données de manière hiérarchique, par exemple en regroupant les articles par auteur et en les classant par popularité.

from operator import attrgetter
from datetime import datetime

class Article:
    def __init__(self, title, author, views, date):
        self.title = title
        self.author = author
        self.stats = type('Stats', (), {'views': views})  
        self.date = date

    def __repr__(self):
        return f"{self.title} by {self.author}"

articles = [
    Article("Python Tips", "Alice", 1500, datetime(2025, 1, 15)),
    Article("Data Science", "Bob", 2500, datetime(2025, 1, 20)),
    Article("Web Dev", "Alice", 1800, datetime(2025, 1, 10))
]

Sort by author and then by views
sorted_articles = sorted(articles, key=attrgetter('author', 'stats.views'))
for article in sorted_articles:
    print(f"{article.author}: {article.title} ({article.stats.views} views)")

6. itertools.chain.from_iterable – Aplatir efficacement les listes imbriquées

La fonction itertools.chain.from_iterable est un outil puissant dans le module itertools de Python qui vous permet d’aplatir des structures itérables imbriquées (par exemple, des listes de listes, des tuples de tuples, etc.) en un seul itérable de manière économe en mémoire.

Contrairement à d’autres méthodes d’aplatissement, telles que les compréhensions de listes ou les boucles imbriquées, chain.from_iterable évite de créer des listes intermédiaires, ce qui le rend particulièrement utile pour gérer de grands ensembles de données.

Exemple : Aplatissement des données de vente

Cet exemple montre comment aplatir efficacement une structure de liste imbriquée à l’aide du fichier itertools.chain de Python. Le scénario implique des données de vente représentées sous la forme d’une liste de sous-listes, où chaque sous-liste contient des tuples représentant des chiffres de vente mensuels.

L’objectif est d'« aplatir » cette structure imbriquée en une seule liste de tuples pour faciliter le traitement ou l’analyse.

from itertools import chain

sales_data = [
    [('Jan', 100), ('Feb', 150)],
    [('Mar', 200), ('Apr', 180)],
    [('May', 210), ('Jun', 190)]
]

Flatten data efficiently
flat_sales = list(chain.from_iterable(sales_data))
print("Flattened sales data:", flat_sales)

7. functools.cache - Mise en cache automatique des fonctions

Le décorateur de cache (introduit dans Python 3.9) stocke les résultats des fonctions pour accélérer les calculs répétés, idéal pour les calculs récursifs ou coûteux.

Exemple : Optimisation de la séquence de Fibonacci

Cet exemple montre comment 'functools.cache' améliore considérablement les performances en stockant les résultats précédemment calculés. Au lieu de recalculer les valeurs de chaque appel récursif, il récupère les résultats mis en cache, ce qui accélère exponentiellement des fonctions telles que les calculs de Fibonacci.

from functools import cache

@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(30))  # Much faster than an uncached version

Sortie :

832040

8. contextlib.suppress - Gestion des exceptions plus propre

La fonction suppress est une alternative plus propre à essayer, sauf lorsque vous souhaitez ignorer des exceptions spécifiques sans code standard inutile.

Exemple : suppression des erreurs de fichier introuvable

Cet exemple tente d’ouvrir un fichier qui n’existe peut-être pas. Au lieu de lever une FileNotFoundError, la fonction suppress() la gère silencieusement, ce qui permet au programme de continuer sans interruption.

from contextlib import suppress

with suppress(FileNotFoundError):
    with open("non_existent_file.txt", "r") as file:
        data = file.read()

print("No crash, program continues!")

Sortie :

No crash, program continues!

9. Pathlib. Path.glob – Recherche intuitive de fichiers

La méthode glob() de pathlib. Path vous permet de rechercher des fichiers qui correspondent à un modèle spécifique dans un répertoire. L’utilisation de rglob() permet la recherche récursive, ce qui signifie qu’il parcourt également tous les sous-répertoires, ce qui est utile pour des tâches telles que trouver tous les scripts Python dans un dossier de projet sans vérifier manuellement chaque répertoire.

Exemple : Recherche récursive de tous les fichiers Python

Cet exemple utilise Path.rglob(« *.py ») pour rechercher de manière récursive tous les fichiers Python (.py) dans le répertoire courant et ses sous-répertoires. Le résultat est une liste de chemins d’accès aux fichiers, ce qui facilite la gestion ou le traitement de plusieurs scripts Python à la fois.

from pathlib import Path

python_files = list(Path(".").rglob("*.py"))
print("Found Python files:", python_files)

10. dataclasses.asdict - Convertissez facilement des objets en dictionnaires

La fonction asdict() de dataclasses simplifie la conversion d’objets en dictionnaires, ce qui les rend sérialisables JSON ou faciles à manipuler.

Exemple : Conversion d’un objet utilisateur en JSON

Transforme un objet dataclass en dictionnaire, ce qui facilite la sérialisation au format JSON.

from dataclasses import dataclass, asdict
import json

@dataclass
class User:
    name: str
    age: int
    email: str

user = User("Alice", 30, "[email ")
user_dict = asdict(user)

print(json.dumps(user_dict, indent=4))  # Easily convert to JSON

Conclusion

Ces fonctions Python moins connues simplifient les opérations complexes tout en améliorant la lisibilité et l’efficacité. Essayez de les intégrer dans vos projets, et vous serez surpris de voir à quel point votre code devient plus propre et plus rapide !

Articles connexes: