Les articles de GNU/Linux Magazine Hors-Série N°95

Image promotionnelle
Arrondir un nombre à la dizaine supérieure ou inférieure
Article mis en avant

Préface

Vous l'attendiez et il est de retour : un nouveau hors-série au format « mémo » sur Python ! Dans cette saison 2, vous pourrez encore trouver une présentation synthétique de différents problèmes accompagnés de leurs solutions et, pour ceux d'entre vous qui souhaiteraient aller plus loin, de leurs explications.
L'objectif : Nous disposons d'un nombre entier ou réel et nous souhaitons obtenir son arrondi à la dizaine supérieure ou inférieure.
L'objectif : Nous voulons définir des constantes « protégées » (i.e. qui ne pourront pas être écrasées) nous permettant de décrire des éléments de configuration d'un programme : mode debugage activé ou non, mode verbeux, chemin vers un modèle, etc.
L'objectif : Nous disposons d'une chaîne de caractères contenant la représentation d'un tuple sous la forme '(1, 2, 3, 4)' et nous souhaitons la convertir en tuple d'entiers (1, 2, 3, 4).
L'objectif : Nous possédons un dictionnaire où les clés sont des tuples : dico = {('Jon', 'Snow') : 12, ('Daenerys', 'Targaryen') : 16, ('Cersei', 'Lannister') : 10, ('Jaime', 'Lannister') : 18}
L'objectif : Nous possédons une liste des notes de différents étudiants où chaque note est stockée sous la forme d'un dictionnaire possédant des clés prenom, nom et note : students = [{'prenom' : 'Juliana', 'nom' : 'Crain', 'note' : 12}, {'prenom' : 'Joe', 'nom' : 'Blacke', 'note' : 15}, {'prenom' : 'Frank', 'nom' : 'Frink', 'note' : 8}] Nous souhaitons ne garder que les personnes dont les notes sont supérieures à la moyenne.
L'objectif : Nous voulons stocker deux octets de valeur 2 et 4, et réaliser diverses opérations : décalage à gauche de 2 bits sur le premier octet, somme des deux octets et multiplication des deux octets.
L'objectif : Nous disposons d'une variable de type bytes (représentation en hexadécimal) contenant un octet et nous souhaitons obtenir sa représentation sous forme de 0 et de 1.
L'objectif : Nous voulons qu'une fonction cleanAll() réalisant différentes opérations de nettoyage soit appelée automatiquement en sortie d'un programme.
L'objectif : Demander à un utilisateur de saisir un mot de passe sans que ce dernier ne s'affiche à l'écran.
L'objectif : Nous disposons d'une chaîne de caractères du type '011101000010001010001000011101010' et nous souhaitons la découper de manière à obtenir des chaînes de 8 caractères.
L'objectif : Nous voulons écrire rapidement une interface CLI pour un projet et nous souhaitons que les utilisateurs puissent disposer de l'autocomplétion pour les aider dans leur utilisation de notre interface.
L'objectif : Nous disposons d'une chaîne de caractères quelconque 'aaaaaaabbbccdeeeeffggggghhhi' et nous souhaitons connaître le nombre d'occurrences des lettres qui la composent.
L'objectif : Formater simplement une chaîne de caractère pour y intégrer des données issues de variables. Par exemple, nous voulons afficher proprement pour un cercle son identifiant (nom donné arbitrairement), les coordonnées de son centre et son périmètre.
L'objectif : Nous disposons d'une liste de chaînes de caractères et pour optimiser un affichage, nous souhaitons les grouper par taille.
L'objectif : Nous disposons d'une DataFrame Pandas (peut importe comment les données ont été obtenues), et nous souhaitons effectuer des opérations sur les colonnes.
L'objectif : Nous disposons d'une DataFrame contenant des cellules vides
L'objectif : Nous disposons d'un fichier CSV dont certaines lignes ne sont pas remplies complètement
L'objectif : Nous devons tester de nombreux couples de valeurs pour savoir lesquels sont égaux, lesquels sont plus grands, etc.
L'objectif : Nous disposons d'une liste très longue dans laquelle il faut que nous isolions les premier, avant-dernier et dernier élément et que nous récupérions les autres éléments sous forme de liste.
L'objectif : Dans un dictionnaire, on essaye parfois d'accéder en lecture ou en écriture à des clés qui n'existent pas.
L'objectif : Nous voulons afficher un à un tous les éléments de trois listes distinctes sans pour autant écrire trois boucles.
L'objectif : Nous affichons des données graphiques (ici un rectangle de couleur) dans une fenêtre graphique Pygame et nous voulons faire évoluer l'affichage sans saccade et de manière fluide.
L'objectif : Nous souhaitons utiliser la toute dernière version de Python disponible.
L'objectif : Nous voulons afficher à l'écran le contenu d'une variable complexe de manière à ce que celle-ci soit le plus lisible possible.
L'objectif : Nous disposons d'une classe Java fonctionnelle et nous souhaitons l'employer dans un script Python sans la recoder.
L'objectif : Dans le cadre d'un projet Python, nous souhaitons documenter proprement de code.
L'objectif : Pour optimiser un script, nous souhaitons réécrire l'une des fonctions en C. Ici ce sera une fonction toute simple permettant de calculer une factorielle.
L'objectif : Nous souhaitons utiliser une fonction Fortran existante dans un code Python.
L'objectif : Tout programme Python est compilé en Bytecode, mais tous ne sont pas enregistrés (les fichiers .pyc dans les répertoires __pycache__). Nous disposons d'un programme Python et nous voulons forcer sa compilation et sa sauvegarde en Bytecode.
L'objectif : Lorsqu'une convention de codage existe, il est toujours mieux de s'y conformer. Pour Python, la norme se nomme PEP 8 (https://www.python.org/dev/peps/pep-0008/) et il est pratique de pouvoir avoir un logiciel qui nous indique quels points nous n'avons pas respecté.
L'objectif : Utiliser un outil regroupant les fonctionnalités de pip et de virtualenv pour créer et gérer des environnements virtuels.
L'objectif : Nous nous demandons quelles sont les conséquences réelles de la modification du code
L'objectif : Nous souhaitons stocker simplement des objets Python pour les réutiliser ultérieurement
L'objectif : Présenter du code ou des fonctionnalités de Python de manière interactive.
L'objectif : Nous disposons d'une fonction particulièrement longue à exécuter et que nous devons appeler plusieurs fois.
L'objectif : Plusieurs versions de Python sont installées sur notre système : Python 2.7.9 (commande python par défaut), Python 3.4.2 (commande python3 par défaut), Python 3.6.3, etc. Nous voulons installer un module nomModule dans Python 3.6.3.
L'objectif : Nous développons un petit script et souhaitons obtenir un affichage montrant quelles sont les parties les plus lentes du code. Notre script va calculer la suite de Fibonacci.
L'objectif : Disposant d'un modem 3G (je prendrai un Huawei E169 comme exemple), nous souhaitons pouvoir envoyer des SMS depuis un script Python.
L'objectif : Disposant d'un modem 3G (ici Huawei E169 pour l'exemple), nous voulons analyser des SMS qui nous sont envoyés.
L'objectif : Possédant un compte Gmail glmf@gmail.com, nous voulons l'utiliser pour envoyer un e-mail depuis un script Python.
L'objectif : Nous souhaitons accéder aux évènements de l'agenda MesRDV sur Google Calendar (associé au compte moi@gmail.com).
L'objectif : Le Web regorge d'informations. Nous voulons récupérer le tableau récapitulatif du classement de Ligue 1 sur http://www.lfp.fr/ligue1/classement, ce qui nous permettra de stocker les données au format CSV pour effectuer par exemple des calculs statistiques par la suite.
L'objectif : Récolter la liste des articles des derniers numéros standard et hors-séries de GNU/Linux Magazine sur https://connect.ed-diamond.com/GNU-Linux-Magazine.
L'objectif : À des fins de test, nous voulons simuler le comportement d'un utilisateur sur une page web. Nous allons effectuer une recherche sur le terme « python » sur la page https://boutique.ed-diamond.com/.
L'objectif : Dans un gros projet, nous nous apercevons que notre programme consomme beaucoup de mémoire et nous souhaiterions pouvoir libérer simplement et rapidement un peu de mémoire.
L'objectif : Nous disposons de plusieurs décorateurs que nous souhaitons appliquer sur une même fonction.
L'objectif : Nous possédons une classe Nombre qui contient un attribut nb stockant un réel
L'objectif : Créer une classe dans laquelle on empile des valeurs et qui affiche le total en sortie de bloc with.
L'objectif : Sur un générateur, obtenu par exemple par compréhension de liste, il est impossible d'appliquer le slicing
L'objectif : Les boucles de type do… while n'existent pas en Python. Comment obtenir alors le même comportement ?
L'objectif : Écrire une structure conditionnelle ayant la même construction qu'un switch en C
L'objectif : Nous souhaitons associer aux éléments d'une liste un compteur sans que cela vienne alourdir notre programme avec la gestion d'une variable supplémentaire.
L'objectif : Mettre en place le patron de conception « Chaîne de responsabilité » qui permet à des classes d'essayer de répondre à une requête sans connaître les possibilités des autres classes sur cette requête. Nous voulons créer un filtre qui, en fonction de la donnée qui lui est transmise : - s'il s'agit d'une chaîne de caractères non convertible en entier retourne cette chaîne en majuscules ; - s'il s'agit d'un entier ou d'une chaîne de caractères convertible en entier retourne le double de cet entier.
L'objectif : Mettre en place le patron de conception « Mémento » qui permet à un objet de restaurer son état précédent (les valeurs de ses attributs), sans violer le principe de l'encapsulation. Nous sauvegarderons ici l'historique d'un attribut value.
L'objectif : Mettre en place le patron de conception « Adapter » permettant de convertir l'interface d'une classe en une autre interface attendue par le client.
L'objectif : Mettre en place le patron de conception « Facade » permettant de masquer une interface complexe qui sera ainsi utilisée de manière beaucoup plus simple. Nous allons développer une classe DateSimple qui sera une façade à l'utilisation du module datetime. Nous n'implémenterons ici que la méthode getToday() qui donnera la date du jour en précisant le jour de la semaine en français.
L'objectif : Mettre en place le patron de conception « Strategy » permettant de sélectionner quel type d'algorithme employer avec un objet donné.
L'objectif : Mettre en place le patron de conception « Factory Method » permettant de fabriquer des objets à partir d'une classe déléguant la création des objets proprement dits à des sous-classes. Nous prendrons comme cas d'étude une classe Geometrie à laquelle nous pourrons demander de créer des objets Cercle ou Carre.
L'objectif : Nous disposons de la classe suivante