Maison >développement back-end >Tutoriel Python >Conseils avancés pour améliorer votre code Python
La simplicité de Python permet aux développeurs d'écrire des programmes fonctionnels rapidement, mais des techniques avancées peuvent rendre votre code encore plus efficace, maintenable et élégant. Ces conseils et exemples avancés feront passer vos compétences Python au niveau supérieur.
Lorsque vous travaillez avec de grands ensembles de données, utilisez des générateurs au lieu de listes pour économiser de la mémoire :
# List consumes memory upfront numbers = [i**2 for i in range(1_000_000)] # Generator evaluates lazily numbers = (i**2 for i in range(1_000_000)) # Iterate over the generator for num in numbers: print(num) # Processes one item at a time
Pourquoi : Les générateurs créent des éléments à la volée, évitant ainsi d'avoir à stocker la séquence entière en mémoire.
Pour les classes qui stockent principalement des données, les classes de données réduisent le code standard :
from dataclasses import dataclass @dataclass class Employee: name: str age: int position: str # Instead of defining __init__, __repr__, etc. emp = Employee(name="Alice", age=30, position="Engineer") print(emp) # Employee(name='Alice', age=30, position='Engineer')
Pourquoi : les classes de données gèrent automatiquement __init__ , __repr__ et d'autres méthodes.
Les gestionnaires de contexte personnalisés simplifient la gestion des ressources :
from contextlib import contextmanager @contextmanager def open_file(file_name, mode): file = open(file_name, mode) try: yield file finally: file.close() # Usage with open_file("example.txt", "w") as f: f.write("Hello, world!")
Pourquoi : Les gestionnaires de contexte assurent un nettoyage approprié (par exemple, la fermeture des fichiers) même si une exception se produit.
4. Profitez des annotations de fonctions
Les annotations améliorent la clarté et permettent une analyse statique :
def calculate_area(length: float, width: float) -> float: return length * width # IDEs and tools like MyPy can validate these annotations area = calculate_area(5.0, 3.2)
Pourquoi : Les annotations permettent au code de s'auto-documenter et aident à détecter les erreurs de type pendant le développement.
Les décorateurs étendent ou modifient les fonctionnalités sans changer la fonction d'origine :
def log_execution(func): def wrapper(*args, **kwargs): print(f"Executing {func.__name__} with {args}, {kwargs}") return func(*args, **kwargs) return wrapper @log_execution def add(a, b): return a + b result = add(3, 5) # Output: Executing add with (3, 5), {}
Pourquoi : Les décorateurs réduisent la duplication des tâches telles que les fonctions de journalisation, d'authentification ou de synchronisation.
Le module functools simplifie les comportements de fonctions complexes :
from functools import lru_cache @lru_cache(maxsize=100) def fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(50)) # Efficient due to caching
Pourquoi : Des fonctions comme lru_cache optimisent les performances en mémorisant les résultats d'appels de fonctions coûteux.
Le module de collections propose des structures de données avancées :
from collections import defaultdict, Counter # defaultdict with default value word_count = defaultdict(int) for word in ["apple", "banana", "apple"]: word_count[word] += 1 print(word_count) # {'apple': 2, 'banana': 1} # Counter for frequency counting freq = Counter(["apple", "banana", "apple"]) print(freq.most_common(1)) # [('apple', 2)]
Pourquoi : defaultdict et Counter simplifient les tâches telles que le comptage des occurrences.
Pour les tâches liées au CPU ou aux E/S, l'exécution parallèle accélère le traitement :
from concurrent.futures import ThreadPoolExecutor def square(n): return n * n with ThreadPoolExecutor(max_workers=4) as executor: results = executor.map(square, range(10)) print(list(results)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Pourquoi : concurrent.futures facilite le multithreading et le multi-traitement.
9. Utilisez pathlib pour les opérations sur les fichiers
Le module pathlib fournit un moyen intuitif et puissant de travailler avec les chemins de fichiers :
from pathlib import Path path = Path("example.txt") # Write to a file path.write_text("Hello, pathlib!") # Read from a file content = path.read_text() print(content) # Check if a file exists if path.exists(): print("File exists")
Pourquoi : pathlib est plus lisible et polyvalent que os et os.path.
Testez des systèmes complexes en vous moquant des dépendances :
# List consumes memory upfront numbers = [i**2 for i in range(1_000_000)] # Generator evaluates lazily numbers = (i**2 for i in range(1_000_000)) # Iterate over the generator for num in numbers: print(num) # Processes one item at a time
Pourquoi : La moquerie isole le code testé, garantissant ainsi que les dépendances externes n'interfèrent pas avec vos tests.
La maîtrise de ces techniques avancées améliorera vos compétences en codage Python. Intégrez-les à votre flux de travail pour écrire du code non seulement fonctionnel mais également efficace, maintenable et Pythonique. Bon codage !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!