Astuces Python

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().

Astuces Python
Astuces Python

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 !

Publications similaires

1 Commentaire
Le plus récent
Le plus ancien Le plus populaire
Commentaires en ligne
Afficher tous les commentaires