Mes trucs et astuces en Python qui est l’un des langages de programmation les plus populaires et les plus demandés au monde. Ceci pour plusieurs raisons:
- C’est facile à apprendre
- C’est super polyvalent
- Il a une vaste gamme de modules et de bibliothèques
J’utilise quotidiennement Python dans le cadre de mon travail en tant que data scientist. De mon utilisation, j’ai relevé quelques trucs et astuces en Python que je vous dévoile et partage.
La plupart de ces «astuces» sont des éléments que j’ai utilisés ou sur lesquels je suis tombé par hasard au cours de mon travail au quotidien. J’en ai trouvé certains en parcourant la documentation Python Standard Library. Et d’autres sur PyPi.
all ou any
Une des raisons pour lesquelles Python est un langage si populaire est qu’il est lisible et expressif.
On dit souvent en plaisantant que Python est un ‘pseudocode exécutable’. Mais lorsqu’on peut écrire un code comme celui-ci ci-dessous, il est difficile de dire le contraire:
x = [True, True, False] if any(x): print("Au moins un True") if all(x): print("Aucun False") if any(x) and not all(x): print("Au moins un True et un False")
bashplotlib
Vous voulez tracer des graphiques dans la console?
$ pip install bashplotlib
Vous pouvez avoir des graphiques dans la console.
Collections
Python possède d’excellents types de données par défaut, mais parfois ils ne se comportent pas exactement comme vous le souhaitez.
Heureusement, la bibliothèque standard Python propose le module collections. Cet add-on pratique vous fournit d’autres types de données.
from collections import OrderedDict, Counter # mémorise l'ordre d'ajout des clés x = OrderedDict(a = 1, b = 2, c = 3) # compte la fréquence de chaque caractère y = Counter("Hello World!")
dir
Vous êtes-vous déjà demandé comment regarder à l’intérieur d’un objet Python et voir quels sont ses attributs? Evidemment ^^
A partir de la ligne de commande:
>>> dir() >>> dir("Hello World") >>> dir(dir)
Cela peut être une fonctionnalité très utile lors de l’exécution interactive de Python et lors de l’exploration dynamique des objets et des modules avec lesquels vous travaillez.
Lire davantage sur dir ici.
Emoji
Oui j’ai bien écrit emoji.
$ pip install emoji
Ne prétendez pas que vous n’allez pas essayer…
from emoji import emojize print(emojize(":thumbs_up:"))
from __future__ import
Une conséquence de la popularité de Python est qu’il y a toujours de nouvelles versions en développement. Nouvelles versions signifient nouvelles fonctionnalités – à moins que votre version ne soit obsolète.
Pas de crainte cependant. Le module __future__ vous permet d’importer des fonctionnalités à partir de futures versions de Python. C’est littéralement comme un voyage dans le temps, ou un peu de magie, ou quelque chose du genre 🙂
from __future__ import print_function print("Hello World!")
geopy
La géographie peut parfois être un terrain difficile pour les programmeurs (sans mauvais jeux de mot). Mais le module geopy nous facilite énormément la tâche.
$ pip install geopy
Cela fonctionne en extrayant les API d’une gamme de différents services de géocodage. Il vous permet d’obtenir l’adresse complète du lieu, sa latitude, sa longitude et même son altitude.
Il existe également une classe de distance utile qui calcule la distance entre deux lieux dans votre unité de mesure préférée.
from geopy import GoogleV3 place = "8 Rue de Belleville, Paris" location = GoogleV3().geocode(place) print(location.address) print(location.location)
howdoi
Vous êtes bloqué par un problème de codage et vous ne vous souvenez plus de la solution que vous avez vue auparavant? Vous devez vérifier StackOverflow, mais vous ne voulez pas quitter le terminal?
Pour cela, vous avez besoin de cet outil de ligne de commande utile: howdoi.
$ pip installer howdoi
Posez-lui la question que vous avez et il fera de son mieux pour vous répondre.
$ howdoi vertical alignn css $ howdoi for loop in java $ howdoi undo commits in git
Sachez cependant que cela élimine le code des principales réponses de StackOverflow. Cela ne donne peut-être pas toujours les informations les plus utiles…
$ howdoi exit vim
inspect
Le module inspect de Python est très utile pour comprendre ce qui se passe dans les coulisses. Vous pouvez même appeler ses méthodes sur lui-même!
L’exemple de code ci-dessous utilise inspect.getsource() pour afficher son propre code source. Il utilise également inspect.getmodule() pour afficher le module dans lequel il a été défini.
La dernière ligne de code affiche son propre numéro de ligne.
import inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
Bien entendu, au-delà de ces utilisations triviales, le module inspect peut s’avérer utile pour comprendre ce que fait votre code. Vous pouvez également l’utiliser pour écrire du code auto-documenté.
Jedi
La bibliothèque Jedi est une bibliothèque d’auto-complétion et d’analyse de code. Cela rend l’écriture du code plus rapide et plus productif.
Sauf si vous développez votre propre IDE, vous voudrez probablement utiliser Jedi en tant qu’éditeur de plugin.
Cependant, vous utilisez peut-être déjà Jedi. Le projet IPython utilise Jedi pour sa fonctionnalité de complétion automatique du code.
**kwargs
En apprenant une langue, il y a beaucoup d’étapes d’apprentissage. Avec Python, comprendre la mystérieuse syntaxe **kwargs compte probablement pour une.
Le double astérisque placé devant un objet dictionnaire vous permet de transmettre le contenu de ce dictionnaire sous forme de paramètres d’une fonction.
Les clés du dictionnaire sont les noms des arguments et les valeurs sont les valeurs transmises à la fonction. Vous n’avez même pas besoin de l’appeler kwargs!
dictionary = {"a": 1, "b": 2} def someFunction(a, b): print(a + b) return # 2 applications de la fonction someFonction identiques: someFunction(**dictionary) someFunction(a=1, b=2)
Ceci est utile lorsque vous souhaitez écrire des fonctions pouvant gérer des paramètres non définis à l’avance.
Compréhension de liste
Ce que je préfère de la programmation en Python c’est la compréhension de liste.
Ces expressions facilitent la rédaction de code très propre qui se lit presque comme un langage naturel.
numbers = [1,2,3,4,5,6,7] evens = [x for x in numbers if x % 2 is 0] odds = [y for y in numbers if y not in evens] cities = ['Paris', 'Dublin', 'Copenhage'] def visit(city): print("Bienvenue à "+city) for city in cities: visit(city)
map
Python prend en charge la programmation fonctionnelle à travers un certain nombre de fonctionnalités intégrées. L’une des plus utiles est la fonction map(), en particulier en combinaison avec les fonctions lambda.
x = [1, 2, 3] y = map(lambda x : x + 1 , x) # affiche [2,3,4] print(list(y))
Dans l’exemple ci-dessus, map() applique une fonction lambda simple à chaque élément de x. Il retourne un objet map, qui peut être converti en un objet itératif tel qu’une liste ou un tuple.
newspaper3k
Si vous ne l’avez pas déjà vu, préparez-vous à vous laisser impressionner par le module newspaper3k de Python.
Il vous permet de récupérer des articles de presse et des méta-données associées à partir d’une gamme de publications internationales de premier plan. Vous pouvez récupérer des images, du texte et des noms d’auteurs.
Il a même des fonctionnalités NLP intégrées.
Donc, si vous songez à utiliser BeautifulSoup ou une autre bibliothèque de Webscraping pour votre prochain projet, épargnez-vous votre temps et vos efforts et installez plutôt newspaper3k.
$ pip install newspaper3k
Surcharge de l’opérateur
Python fournit un support pour la surcharge d’opérateurs, qui est l’un de ces termes qui vous place dans la catégorie « informaticien légitime ».
C’est en fait un concept simple. Vous êtes-vous déjà demandé pourquoi Python vous permet d’utiliser l’opérateur + pour ajouter des nombres et concaténer des chaînes? C’est la surcharge de l’opérateur en action.
Vous pouvez définir des objets qui utilisent les symboles d’opérateur standard de Python à leur manière. Cela vous permet de les utiliser dans des contextes pertinents pour les objets avec lesquels vous travaillez.
class Thing: def __init__(self, value): self.__value = value def __gt__(self, other): return self.__value > other.__value def __lt__(self, other): return self.__value < other.__value something = Thing(100) nothing = Thing(0) # True something > nothing # False something < nothing # Error something + nothing
pprint
La fonction d’affichage par défaut de Python fait son travail. Mais essayez d’afficher tout objet volumineux et imbriqué, et le résultat est plutôt moche.
C’est là que le module pprint (pour pretty print) de la bibliothèque standard entre en scène. Il affiche des objets structurés complexes dans un format facile à lire.
Indispensable pour tout développeur Python utilisant des structures de données non triviales.
import requests import pprint url = 'https://randomuser.me/api/?results=1' users = requests.get(url).json() pprint.pprint(users)
Queue
Python prend en charge le multi threading, ce qui est facilité par le module Queue de la bibliothèque standard.
Ce module vous permet d’implémenter des structures de données en file d’attente. Ce sont des structures de données qui vous permettent d’ajouter et de récupérer des entrées selon une règle spécifique.
Les files d’attente «First In, First Out» (ou FIFO) vous permettent de récupérer des objets dans l’ordre dans lequel ils ont été ajoutés. Les files d’attente «Last In, First Out» (LIFO) vous permettent d’accéder en premier aux objets les plus récemment ajoutés.
Enfin, les files d’attente prioritaires vous permettent de récupérer des objets selon leur ordre de tri.
Voici un exemple d’utilisation de Queue pour la programmation multithread en Python.
__repr__
Lors de la définition d’une classe ou d’un objet en Python, il est utile de fournir un moyen « officiel » de représenter cet objet sous forme de chaîne. Par exemple:
>>> file = open('file.txt', 'r') >>> print(file) <open file 'file.txt', mode 'r' at 0x10d30aaf0>
Cela facilite le débogage du code. Ajoutez-le à vos définitions de classe comme ci-dessous:
class someClass: def __repr__(self): return "<some description here>" someInstance = someClass() # affiche <some description here> print(someInstance)
sh
Python est un excellent langage de script. Parfois, l’utilisation des bibliothèques de systèmes d’exploitation et de sous-processus standard peut sembler un peu compliquée.
La bibliothèque sh fournit une alternative intéressante.
Il vous permet d’appeler n’importe quel programme comme s’il s’agissait d’une fonction ordinaire, ce qui est utile pour automatiser les workflows et les tâches, le tout à partir de Python.
import sh sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
Indications de type
Python est un langage de type dynamique. Vous n’avez pas besoin de spécifier des types de données lorsque vous définissez des variables, des fonctions, des classes, etc.
Cela permet de coder rapidement. Cependant, il y a peu de choses plus ennuyeuses qu’une erreur d’exécution provoquée par un problème de frappe simple.
Depuis Python 3.5, vous avez la possibilité de fournir des indicateurs de type lors de la définition de fonctions.
def addTwo(x : Int) -> Int: return x + 2
Vous pouvez également définir des alias de type :
from typing import List Vector = List[float] Matrix = List[Vector] def addMatrix(a : Matrix, b : Matrix) -> Matrix: result = [] for i,row in enumerate(a): result_row =[] for j, col in enumerate(row): result_row += [a[i][j] + b[i][j]] result += [result_row] return result x = [[1.0, 0.0], [0.0, 1.0]] y = [[2.0, 1.0], [0.0, -2.0]] z = addMatrix(x, y)
Bien que cela ne soit pas obligatoire, les annotations de type peuvent rendre votre code plus facile à comprendre.
Ils vous permettent également d’utiliser des outils de vérification de type pour capturer ces erreurs errantes TypeErrors avant l’exécution. Très utile si vous travaillez sur de gros projets!
uuid
Le module uuid de la bibliothèque standard de Python constitue un moyen simple et rapide de générer des ID universellement uniques (ou ‘UUID’).
import uuid user_id = uuid.uuid4() print(user_id)
Cela crée un nombre aléatoire de 128 bits qui sera presque certainement unique.
En fait, il y a plus de 2¹²² UUID possibles qui peuvent être générés. C’est plus de 5 000 000 000 000 000 000 000 000 000 000 000 000 000 000.
La probabilité de trouver des doublons dans un ensemble donné est extrêmement faible. Même avec un billion d’UUID, la probabilité d’un doublon est bien moindre, beaucoup moins que celle sur un milliard.
Assez bon pour seulement deux lignes de code.
Environnements Virtuels
C’est probablement mon truc préféré en Python.
Il est fort probable que vous travailliez simultanément sur plusieurs projets Python. Malheureusement, il arrive que deux projets s’appuient sur des versions différentes de la même dépendance. Lequel installez-vous sur votre système?
Heureusement, la prise en charge par Python des environnements virtuels vous permet d’avoir le meilleur des deux mondes. A partir de la ligne de commande :
python -m venv my-project source my-project/bin/activate pip install all-the-modules
Vous pouvez maintenant avoir des versions autonomes et des installations de Python s’exécutant sur le même ordinateur!
wikipedia
Wikipedia possède une excellente API qui permet aux utilisateurs d’accéder à une énorme masse de connaissances et d’informations totalement gratuites.
Le module wikipedia facilite l’accès à cette API.
import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
À l’instar du site réel, le module prend en charge plusieurs langues et peut retourner des pages aléatoires.
xkcd
L’humour est une caractéristique clé du langage Python – après tout, il tire son nom de la série de sketches comiques britannique Monty Python’s Flying Circus. Une grande partie de la documentation officielle de Python fait référence aux sketches les plus célèbres de la série.
Le sens de l’humour n’est pas limité aux documents, cependant. Essayez la ligne ci-dessous :
import antigravity
YAML
YAML signifie ‘YAML Ain’t Markup Language’. C’est un langage de formatage de données et un sur-ensemble de JSON.
Contrairement à JSON, il peut stocker des objets plus complexes et faire référence à ses propres éléments. Vous pouvez également écrire des commentaires, ce qui le rend particulièrement adapté à l’écriture de fichiers de configuration.
Le module PyYAML vous permet d’utiliser YAML avec Python. Pour l’installer:
$ pip install pyyaml
Et puis importez le dans vos projets :
import yaml
PyYAML vous permet de stocker des objets Python de tout type de données, ainsi que des instances de toute classe définie par l’utilisateur.
zip
Une dernière astuce vraiment cool pour vous. Avez-vous déjà eu besoin de former un dictionnaire à partir de deux listes ?
keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals))
La fonction incorporée de zip() prend un certain nombre d’objets itérables et renvoie une liste de n-uplets. Chaque tuple regroupe les éléments des objets d’entrée en fonction de leur index de position.
Vous pouvez également « décompresser » des objets en appelant *zip().
Merci d’avoir lu mes trucs et astuces en Python !
J’espère que vous avez trouvé quelque chose d’utile pour votre prochain projet.
Python est un langage très diversifié et bien développé. Il y a donc forcément de nombreuses fonctionnalités que je n’ai pas pu inclure.
S’il vous plaît partager l’un de vos trucs et astuces préférés Python en laissant une réponse ci-dessous !